我正在使用反射将Field放在另一个类中,但是当我尝试使用f.set(...)
将值设置到Field中时,我没有Object,只有Class。
我编写类似于此的代码:
Class<?> c = null;
String fieldNameAux = "id";
String classNameAux = "PedV";
try {
c = Class.forName("beans."+classNameAux);
} catch (Exception e){}
Field f = c.getDeclaredField(fieldNameAux);
f.setAccessible(true);
f.set(**something**, ((Edit) objAux).getText();
因为我需要动态获取Class和Field,所以我不能使用这样的东西(但它有效):
Class<?> c = null;
String fieldNameAux = "id";
PedV pedV = new PedV();
c = pedV.getClass();
Field f = c.getDeclaredField(fieldNameAux);
f.setAccessible(true);
f.set(pedV, ((Edit) objAux).getText());
我怎样才能将这个f.set(pedV, ((Edit) objAux).getText();
替换为动态起作用的东西?
OBS :我在数据库中收到fieldNameAux
和classNameAux
。
答案 0 :(得分:3)
您需要创建实例。一种方法是通过c.newInstance
,如果这是一个JavaBean应该是您所需要的(它试图调用该类的零参数构造函数)。否则,您需要通过getDeclaredConstructor
/ getDeclaredConstructors
或类似的方法找到合适的构造函数,然后调用它们来获取实例。
在评论中重新提问:
如果我使用
c.newInstance
,它不会“杀死”/清除我的Field的值?
您的Field
实例没有值;您从c.newInstance
获得的实例。 Field
只是在实例上设置数据的一种方法。
一个例子可能会有所帮助:假设我们有:
public class Foo {
public int a;
public int b;
}
然后我们这样做:
Class f = Class.forName("Foo");
Object inst = f.newInstance();
Field aField = f.getDeclaredField("a");
aField.setInt(inst, 42);
Field bField = f.getDeclaredField("b");
bField.setInt(inst, 67);
...现在我们通过Foo
变量引用了inst
个实例,a
等于42,b
等于67。