Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用泛型类中的反射设置带注释的字段值。(IllegalArgumentException)_Java_Generics_Reflection_Annotations - Fatal编程技术网

Java 使用泛型类中的反射设置带注释的字段值。(IllegalArgumentException)

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

我一直面临一个在Java中暗示反射、注释和泛型的问题。我有一个类,它创建了一个名为
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);
...