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)
谢谢.
这应该有帮助:
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)
您的问题不是很清楚,但我认为您是在问如何使用反射从对象中读取字段的值。
如果您查看 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 对象并不重要。
| 归档时间: |
|
| 查看次数: |
10159 次 |
| 最近记录: |