2016-04-08 8 views
2

Dies ist meine eigene Anmerkung:Warum konnte ich die Anmerkung des Feldes nicht erhalten?

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(); 
} 

dann definiere ich eine Klasse, und legen Sie eine Eigenschaft mit der Anmerkung:

@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; 
    } 
} 

Die @Component ist auch meine.

schließlich definiere ich einen Tracker:

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); 
    } 
} 

das Problem ist, wenn ich das Feld Annotation mit @Autowire bekam, und will die Anmerkung bekommen, kann ich nicht die Anmerkung erhalten:

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

Die at ist null.

warum? (Sorry, ich bin nicht gut in Englisch!)

Antwort

2

Sie verwenden die Aufbewahrungsrichtlinie SOURCE. Das Zitat von sdk:

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

Versuchen Sie, die RUNTIME Aufbewahrungsrichtlinien zu verwenden, anstatt:

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

Laut Dokumentation:

/** 
* 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. 
* 
Verwandte Themen