jeudi 7 avril 2016

Why I couldn't get the field's annotation?

This is my own Annotation:

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

then, I define a class, and set a property with the annotation:

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

The @Component is also mine.

after all, I define a 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);
    }
}

the problem is, when I got the field annotation with @Autowire, and want to get the annotation, I can't get the annotation:

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

the "at" is null.

why? (Sorry, I am not good at English!)





Aucun commentaire:

Enregistrer un commentaire