如何从Field.getType()反射创建对象?

时间:2019-03-19 05:06:32

标签: java reflection

我创建了一个反射函数来创建一个新对象并在其中设置数据。

这是我的代码,但是,我不知道如何填充对象声明类类型:

<Class-Type> newObj = f.getType().getConstructor(new Class[]{}).newInstance();

f是我从class.getDeclaredFields()获得的java.lang.reflect.Field

我已经尝试使用对象类型

Object newObj = f.getType().getConstructor(new Class[]{}).newInstance();

但是在我调用数据之后

Method setterNewObj =newObj.getClass().getDeclaredMethod("set" + Character.toUpperCase(m.getName().charAt(0))+ m.getName().substring(1), m.getType()); setterNewObj.invoke(newObj, this.typeConvert(mapOfValue.get(nameOfColumn), m.getType()));

并且我print.out结果数据未设置(空);

谢谢

1 个答案:

答案 0 :(得分:0)

从我们可以看到,您的代码没有错。
也许您需要提供更完整的代码示例或您所做工作的一些额外信息,以便我们进行检查。

我创建了一小段代码(完整且可运行)以向您展示其工作原理:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

class Buddy {  
    String name;  
    Buddy buddy;

    public Buddy() {}

    public Buddy(String n) {  
        this();
        name = n;  
    }  

    public void setBuddy(Buddy b) {
        if (this.buddy != null)
            this.buddy.buddy = null;
        this.buddy = b;
        b.buddy = this;
    }  

    public void setName(String name) {
        this.name = name;
    }

    private String getInfo() {
        return name;
    }

    public void display() {
        if (buddy != null)
            System.out.println(this.getInfo() +" & "+ buddy.getInfo());
        else
            System.out.println(this.getInfo());
    }  

    public static void main(String args[]) {  
        Buddy s1 = new Buddy("Rick");  
        s1.display();

        System.out.println("\nNeeds his buddy 'Morty' :");
        Buddy s2 = new Buddy("Morty");
        s1.setBuddy(s2);
        s1.display();
        s2.display();

        System.out.println("\nChange to new buddy 'Roller':");
        try {
            // Get the buddy field
            Field f = s1.getClass().getDeclaredField("buddy");

            // Create a new Buddy instance
            Object newObj = f.getType().getConstructor(new Class[]{}).newInstance();

            // Get the name field
            Field m = newObj.getClass().getDeclaredField("name");

            // Get the setter for the name field
            Method setterNewObj = newObj.getClass().getDeclaredMethod("set" + Character.toUpperCase(m.getName().charAt(0))+ m.getName().substring(1), m.getType());

            // Invoke the setter for the name field with a value
            setterNewObj.invoke(newObj, "Roller");

            // Get the setter for the buddy field
            Method setterS1 = s1.getClass().getDeclaredMethod("set" + Character.toUpperCase(f.getName().charAt(0))+ f.getName().substring(1), f.getType());

            // Invoke the setter for the buddy field with the new Buddy instance
            setterS1.invoke(s1, newObj);
        } catch (Exception e) {
            e.printStackTrace();
        }

        s1.display();
        s2.display();
    }
}

您会看到打印新创建的伙伴,而旧伙伴仍然存在:

  

里克

     

需要他的好友“ Morty”:
  瑞克和莫蒂
  莫蒂和里克

     

更改为新的好友“ Roller”:
  瑞克与罗勒
  莫蒂