2016-04-08 95 views
2

這是我自己的批註:爲什麼我無法獲得該字段的註釋?

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.SOURCE) 
public @interface Autowire { 
    public String id(); 
} 

然後,我定義一個類,並設置屬性與註釋:

@Component(id="businessObject") 
public class BusinessObject { 

    @Autowire(id="dataAccessInterface") 
    private DataAccessInterface dai; 

    public void print() { 
     System.out.println(dai.queryFromTableA()); 
    } 

    public void setDai(DataAccessInterface dai) { 
     this.dai = dai; 
    } 
} 

@Component也是我的。

畢竟,我定義了一個追蹤:

public class BeanFactory { 

    private HashMap<String, Object> beanPool; 
    private HashMap<String, String> components; 

    public BeanFactory() { 
     beanPool = new HashMap<>(); 

     scanComponents(); 
    } 

    private void scanComponents() { 
     components = ComponentScanner.getComponentClassName("com.oolong.javase.annotation"); 
    } 

    public Object getBean(String id) throws ClassNotFoundException, 
      InstantiationException, IllegalAccessException, NoSuchMethodException, 
      SecurityException, IllegalArgumentException, InvocationTargetException { 

     if (beanPool.containsKey(id)) { 
      return beanPool.get(id); 
     } 

     if (components.containsKey(id)) { 

      Object bean = Class.forName(components.get(id)).newInstance(); 

      bean = assemblyMember(bean); 

      beanPool.put(id, bean); 

      return getBean(id); 
     } 

     throw new ClassNotFoundException(); 
    } 

    private Object assemblyMember(Object obj) throws ClassNotFoundException, 
      InstantiationException, IllegalAccessException, NoSuchMethodException, 
      SecurityException, IllegalArgumentException, InvocationTargetException { 

     Class cl = obj.getClass(); 

     for (Field f : cl.getDeclaredFields()) { 
      Autowire at = f.getAnnotation(Autowire.class); 

      if (at != null) { 

       Method setMethod = cl.getMethod("set" + captureName(f.getName()), f.getType()); 
       setMethod.invoke(obj, getBean(at.id())); 
      } 
     } 

     return obj; 
    } 

    public static String captureName(String name) { 
     char[] cs=name.toCharArray(); 
     cs[0]-=32; 
     return String.valueOf(cs); 
    } 
} 

的問題是,當我到了現場批註與@Autowire,並希望得到註釋,我不能讓註釋:

Autowire at = f.getAnnotation(Autowire.class); 

atnull

爲什麼? (對不起,我不擅長英語!)

回答

2

您正在使用SOURCE保留策略。從SDK中的名言:

/** 
* Annotations are to be discarded by the compiler. 
*/ 

嘗試使用替代RUNTIME保留策略:

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Autowire { 
    public String id(); 
} 

根據文檔:

/** 
* Annotations are to be recorded in the class file by the compiler and 
* retained by the VM at run time, so they may be read reflectively. 
* 
相關問題