Java 使用泛型类中的反射设置带注释的字段值。(IllegalArgumentException)
我一直面临一个在Java中暗示反射、注释和泛型的问题。我有一个类,它创建了一个名为Java 使用泛型类中的反射设置带注释的字段值。(IllegalArgumentException),java,generics,reflection,annotations,Java,Generics,Reflection,Annotations,我一直面临一个在Java中暗示反射、注释和泛型的问题。我有一个类,它创建了一个名为B的泛型类型的新实例。然后,它将使用MyCustomAnnotation注释搜索任何字段,并将其值设置为确定值 执行此操作的类是: import java.lang.reflect.Field; 导入java.lang.reflect.InvocationTargetException; 公共类MyInstanceCreator{ 私有最终字符串myValue=“Hello world!”; public B cr
B
的泛型类型的新实例。然后,它将使用MyCustomAnnotation
注释搜索任何字段
,并将其值设置为确定值
执行此操作的类是:
import java.lang.reflect.Field;
导入java.lang.reflect.InvocationTargetException;
公共类MyInstanceCreator{
私有最终字符串myValue=“Hello world!”;
public B createInstance(类classType)抛出NoSuchMethodException、InstanceionException、IllegalAccessException、InvocationTargetException{
B obj=classType.getConstructor().newInstance();
对于(字段f:classType.getDeclaredFields()){
if(f.isAnnotationPresent(MyCustomAnnotation.class)){
System.out.println(“已注释!”);
更新字段(obj,f);
}
}
返回obj;
}
私有void updateField(B实例,字段)引发IllegalAccessException{
字段。setAccessible(true);
set(myValue,instance);
字段.setAccessible(false);
}
}
注释类:
import java.lang.annotation.Retention;
导入java.lang.annotation.RetentionPolicy;
@保留(RetentionPolicy.RUNTIME)
public@interface MyCustomAnnotation{}
自定义类型有一个类型为String
的注释字段:
公共类MyCustomType{
@MyCustomAnnotation
私有字符串值;
公共字符串getValue(){
返回值;
}
}
最后,我的主要课程是:
公共类MyClass{
公共静态void main(字符串参数[]){
试一试{
MyInstanceCreator iCreator=新的MyInstanceCreator();
MyCustomType myObj=iCreator.createInstance(MyCustomType.class);
System.out.println(myObj.getValue());
}捕获(例外e){
e、 printStackTrace();
}
}
}
程序的输出为:
已注释!
java.lang.IllegalArgumentException:无法将java.lang.String字段MyCustomType.value设置为java.lang.String
位于java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetileGalargumentException(UnsafeFieldAccessorImpl.java:167)
位于java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ThrowSetileGalargumentException(UnsafeFieldAccessorImpl.java:171)
位于java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
位于java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75)
位于java.base/java.lang.reflect.Field.set(Field.java:780)
在MyInstanceCreator.updateField(MyInstanceCreator.java:21)
在MyInstanceCreator.createInstance(MyInstanceCreator.java:13)
位于MyClass.main(MyClass.java:5)
我不明白为什么反射不能像IllegalArgumentException
消息所说的那样将java.lang.String
值分配给java.lang.String
字段。我一定是错过了什么,但我似乎想不出来
感谢您的帮助 这是你的问题
...
field.set(myValue, instance);
...
公共空集(对象对象,对象值)
参数:
obj-应修改其字段的对象
值-正在修改的obj字段的新值
不,你不是傻瓜。因为如果你是哑巴,那么我也是哑巴。哈哈。在尝试了两三个不那么简单的修复之后,我才发现问题出在哪里。如果像我一样,您没有经常使用
Field.set(Object,Object)
方法,那么很容易混淆哪个Object
param是哪个。所以不要担心:)
...
field.set(instance, myValue);
...