Java反思问题

Nat*_*ell 8 java reflection jar illegalargumentexception

我正在开发一个使用反射来获取正在运行的java应用程序的字段的项目.

我设法得到了字段,但我无法读取或写入它们.这是我在网上找到的一个例子:

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

问题是我使用运行的jar文件中的类,我尝试操作的类是从classLoader获得的.因此,我只是拥有'.class'而不是'MyObject.class'.为了获得'MyObject',我尝试使用ClassLoader,但这不起作用.

如果我只使用'.class':

Object value = field.get(theLoadedClass);
Run Code Online (Sandbox Code Playgroud)

我会收到这个错误:

java.lang.IllegalArgumentException: Can not set int field myClass.field to java.lang.Class
Run Code Online (Sandbox Code Playgroud)

谢谢.

JB-*_*JB- 5

这应该有帮助:

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);
Run Code Online (Sandbox Code Playgroud)


Mat*_*arz 0

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

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

Object value = field.get(someInstanceOfTheLoadedClass);
Run Code Online (Sandbox Code Playgroud)

您的错误似乎是尝试将 Class 类型的内容分配给 int 类型的字段的结果。您应该使用Field.setInt来设置 int 字段。

使用 .class 还是使用 Class.forName 获取 Class 对象并不重要。