2016-04-08 25 views
2

Bu benim kendi ek açıklama geçerli:Neden alanın notunu alamadım?

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

o zaman, ben bir sınıf tanımlamak ve ek açıklamanın bulunduğu bir özelliğini ayarlayın:

@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 da benim.

: Ben ek açıklama alamıyorum ben @Autowire ile saha ek açıklama var ve ek açıklama almak istediğinizde

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

sorun, şöyledir:

hepsinden öte, bir izci tanımlamak

at, null'dir.

neden? (Üzgünüz, İngilizce değilim!)

cevap

2

SOURCE Tutma politikasını kullanıyorsunuz. sdk alıntı: Belgelere göre

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

:

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

Try yerine RUNTIME tutma politikasını kullanmak

/** 
* 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. 
* 
İlgili konular