Java结合注解与反射使用的简单入门

1.创建注解

就拿吾项目里的一个注解来解释:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Skin {
    String name()default "NULL";
    String parent()default "NULL";
}

@Target(ElementType.TYPE) 这个注解是说明该注解的作用范围是方法,类还是字段等,这里吾指定这个注解是用于类的。

@Retention(RetentionPolicy.RUNTIME) 这个注解是说明该注解的作用阶段是编译阶段,加载阶段还是运行阶段,这里这个注解吾是用于动态加载的,所以定义为运行时存在。

@interface是注解类的定义,有它编译器才知道这个类是个注解(注意:注解属于类型而不是注释)

String name()default "NULL";这个是定义了该注解的内容name,返回值是String,使用默认值关键字default定义默认值为“NULL”,内容的本质其实就是方法。

2.获得注解并获得注解的内容

也是一个简单的例子:

Map<String,Class<?>>classMap=skinClassScanner.getClasses();//这里的skinClassScanner是一个用于快速获得指定路径所有的类的工具类。
ArrayList<Class<?>>classes=new ArrayList<>();
for (Class<?>cla:classMap.values()){
    if (cla.getAnnotation(cn.korostudio.shouhoupet.pet.loader.Skin.class)!=null){
        classes.add(cla);
        logger.info("Found Skin:Pet="+ ((cn.korostudio.shouhoupet.pet.loader.Skin)cla.getAnnotation(cn.korostudio.shouhoupet.pet.loader.Skin.class)).parent()+" Name="+((cn.korostudio.shouhoupet.pet.loader.Skin)cla.getAnnotation(cn.korostudio.shouhoupet.pet.loader.Skin.class)).name());
    }
}

可以发现,对注解的操作其实和操作对象相似,可以通过Class.getAnnotation(Class)获取指定的注解或者Class.getAnnotations()获取该Class的所有注解,使用类似于对象的操作来获取内容(.name()和.parent()),这里通过获取指定注解是否存在来判断该类是否有了指定的注解来判断是否是需要的类,然后存入Arraylist中准备批量实例化。

到这里,注解的基本操作就介绍完了。

Q.E.D.


在校大学生一名 熟悉java/cpp
正在摸索Java Spring 与 桌面应用ing......