开发过程中经常使用到注解,体验到注解的方便快捷。同时他还支持自定义注解。通过自定义注解来实现一下常用的功能。
创建
以下注解测试作用,主要是给带有注解的方法,打印一下注解值。使用关键字@interface
声明。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Singleton {
boolean value() default true;
}
上面的两个注解说简单点就是对自定义注解 的描述和补充。作用在类上面,可以被反射机制读取。
@Target(ElementType.TYPE) 指示注释类型所适用的程序元素的种类。
TYPE值 说明 ANNOTATION_TYPE 注释类型声明 CONSTRUCTOR : 构造方法声明 FIELD 字段声明(包括枚举常量) LOCAL_VARIABLE 局部变量声明 METHOD 方法声明 PACKAGE 包声明 PARAMETER 参数声明 TYPE 类、接口(包括注释类型)或枚举声明 @Retention(RetentionPolicy.RUNTIME):指示注释类型的注释要保留多久。
RetentionPolicy值 说明 CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。这是默认的行为 RUNTIME: 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。 SOURCE 编译器要丢弃的注释
建立工厂类和其实现类
首先要知道几个获取通过反射注解值的方法:
方法名 | 用法 |
---|---|
Annotation getAnnotation (Class annotationType) | 获取注解在其上的annotationType |
Annotation[] getAnnotations() | 获取所有注解 |
isAnnotationPresent (Class annotationType) | 判断当前元素是否被annotationType注解 |
Annotation[] getDeclareAnnotations() | 与getAnnotations() 类似,但是不包括父类中被Inherited修饰的注解 |
Factory:
public interface Factory {
Object create(Class clazz) throws Exception;
}
FactoryImpl
public class FactoryImpl implements Factory {
private static Object object = null;
@Override
public Object create(Class clazz) throws Exception {
if (clazz.isAnnotationPresent(Singleton.class)) {// 判断是否存在注释类型
// 获取注解的值
Singleton annotation = (Singleton) clazz
.getAnnotation(Singleton.class);// 如果存在该元素的指定类型的注释,则返回这些注释,否则返回
// null。
boolean isSingle = annotation.value();
if (isSingle) {
// 使用单例来提供服务
if (object == null)
object = clazz.newInstance();
} else {
// 使用非单例的形式提供服务。
System.out.println("非单例");
object = clazz.newInstance();
}
}
return object;
}
}
测试类
public class Test {
public static void main(String[] args) throws Exception {
Factory factory = new FactoryImpl();
Object object = factory.create(Singleton.class);
Object object2 = factory.create(Singleton.class);
System.out.println(object==object2);
}
}
结果:true
说明了两个对象的地址相同。为同一个对象。