我研究注释,在一个学习任务中,我必须将一些注释为@Cache
的缓存实现注入注释为@InjectCache
的字段。
我编写了这段代码,但我在表达式cannot resolve symbol name()
上遇到cache.getAnnotation(Cache.class).name()
错误,但field.getAnnotation(InjectCache.class).name()
之前的几个字符串解析没有错误。
@Cache
和@InjectCache
都有参数name()
,他们唯一的区别是@TARGET
注释。
package annotations;
import annotations_test.MapCache;
import annotations_test.SortedMapCache;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class Injector {
public static void inject(Object instance){
List<Field> fields = new ArrayList<Field>();
List<Class> caches;
caches = addAllCaches();
fields = getAnnotatedFields(fields, instance.getClass());
try {
for (Field field : fields) {
field.setAccessible(true);
String name = field.getAnnotation(InjectCache.class).name();
Boolean implementation_not_found = true;
for (Class cache: caches){
if (name.equals(cache.getAnnotation(Cache.class).name())){
implementation_not_found = false;
field.set(instance, cache.newInstance());
}
}
if (implementation_not_found){
throw new TypeNotPresentException(Cache.class.getTypeName(),null);
}
}
}catch (TypeNotPresentException e){
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
这就是@Cache
的样子:
package annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value= ElementType.TYPE)
@Retention(value= RetentionPolicy.RUNTIME)
public @interface Cache {
String name();
}
@InjectCache
:
package annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value= ElementType.FIELD)
@Retention(value= RetentionPolicy.RUNTIME)
public @interface InjectCache {
String name();
}
答案 0 :(得分:1)
您收到此错误,因为for循环中的Class cache
为raw type。
您需要将其更改为具有泛型类型(即使它只是通配符<?>
):
for (Class<?> cache: caches) {
// ...
}
原因是,您不能对原始类型使用任何通用方法。如果没有通配符,getAnnotation(Cache.class)
的返回类型为Annotation
,而不是Cache
注释类型。
添加通配符是最佳选择,因为它使getAnnotation
方法类型安全。您也可以将其转换为正确的类型:
((Cache)cache.getAnnotation(Cache.class)).name()