自定义注解Annotation

开发过程中经常使用到注解,体验到注解的方便快捷。同时他还支持自定义注解。通过自定义注解来实现一下常用的功能。

创建

以下注解测试作用,主要是给带有注解的方法,打印一下注解值。使用关键字@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
说明了两个对象的地址相同。为同一个对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值