Java反射问题



我正在研究一个项目,该项目使用反射来获取正在运行的java应用程序的字段。

我设法得到了字段,但是我不能读或写它们。这是我在网上找到的一个例子:

Class aClass = MyObject.class
Field field = aClass.getField("someField");
MyObject objectInstance = new MyObject();
Object value = field.get(objectInstance);
field.set(objetInstance, value);

问题是,我使用运行中的jar文件中的类,而我尝试操作的类是从classLoader获得的。而不是myobject。class我只有。class。为了获得'MyObject',我尝试使用ClassLoader,但没有工作。

如果我只使用'.class':

Object value = field.get(theLoadedClass);

我将得到这个错误:

java.lang.IllegalArgumentException: Can not set int field myClass.field to java.lang.Class

谢谢。

这应该有帮助:

Class aClass = myClassLoader.loadClass("MyObject"); // use your class loader and fully qualified class name
Field field = aClass.getField("someField");
// you can not use "MyObject objectInstance = new MyObject()" since its class would be loaded by a different classloader to the one used to obtain "aClass"
// instead, use "newInstance()" method of the class
Object objectInstance = aClass.newInstance();
Object value = field.get(objectInstance);
field.set(objetInstance, value);

您需要一个适当的类的实例来传递到字段中。get/set方法。

要从class获取实例,您可以尝试以下选项:

Class<?> clazz = MyObject.class;
// How to call the default constructor from the class:
MyObject myObject1 = clazz.newInstance(); 
// Example of calling a custom constructor from the class:
MyObject myObject2 = clazz.getConstructor(String.class, Integer.class).newInstance("foo", 1); 

来自文档:java.lang.IllegalArgumentException抛出:

如果在可能的展开后,新值不能转换为基础字段的类型通过标识或扩展转换时,该方法抛出一个IllegalArgumentException。

这意味着您试图设置字段的对象类型(object)不能转换为实际类型。这里尽量不要使用Object。

无关,看看你的代码,我要改变

Class aClass = MyObject.class; 

块:

Class aClass = Class.forName("fullyQualifiedMyObjectClassName.e.g.com.bla.bla.MyObject");

您的问题不是很清楚,但我认为您正在询问如何使用反射从对象读取字段的值。

如果您查看JavaDoc of Field。你会看到Field的参数。get应该是您试图从中读取字段的对象实例(而不是Class对象)。所以它应该是这样的:

Object value = field.get(someInstanceOfTheLoadedClass);

你的错误似乎是试图将类类型的东西赋值给int类型的字段的结果。你应该使用Field。设置int字段

无论您是使用。Class还是使用Class. forname来获取Class对象都没有关系。

如果在编译时不知道类型,请使用:

Class = objectInstance.getClass();

正如其他海报所说,你必须知道字段的类型,并使用正确的类型。

要确定此运行时使用Field.getType()并使用正确的getter和setter。

这样行吗?

Class aClass = MyObject.class;
Field field = aClass.getDeclaredField("someField");
field.setAccessible(true);
MyObject objectInstance = new MyObject();
Object value = field.get(objectInstance);
field.set(objectInstance, value);

相关内容

  • 没有找到相关文章

最新更新