无法解析注释参数

时间:2016-05-23 09:18:34

标签: java annotations

我研究注释,在一个学习任务中,我必须将一些注释为@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();
}

1 个答案:

答案 0 :(得分:1)

您收到此错误,因为for循环中的Class cacheraw type

您需要将其更改为具有泛型类型(即使它只是通配符<?>):

for (Class<?> cache: caches) {
  // ...
}

原因是,您不能对原始类型使用任何通用方法。如果没有通配符,getAnnotation(Cache.class)的返回类型为Annotation,而不是Cache注释类型。

添加通配符是最佳选择,因为它使getAnnotation方法类型安全。您也可以将其转换为正确的类型:

((Cache)cache.getAnnotation(Cache.class)).name()