我正在研究一个项目,该项目使用反射来获取正在运行的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);