Java自定义注解

在日常的开发过程中,我们会使用到大量的注解,这些注解使用起来非常的方便快捷,会大大提高我们的编码效率。

但在Java中如何自定义一个注解呢?下面我就与大家一起来分享。

1、自定义注解Properties

package com.xiao.annotion;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Description 通过注解给类注入属性值
 * @Auther: 笑笑是一个码农
 * @Date: 23:15 2020/4/26
 */
@Target(ElementType.TYPE) // 表示作用的范围,TYPE表示该注解只能作用于类上
@Retention(RetentionPolicy.RUNTIME) // 表示该注解保存的范围,RUNTIME表示会保存在class字节码文件中,并会被jvm解析
public @interface Properties {

    String name();

    int  age();
}

其中我们使用了jdk为我们提供的一些元注解

@Target(ElementType.TYPE) 该注解表示我们定义的注解作用的范围,TYPE表示只能作用于类上
@Retention(RetentionPolicy.RUNTIME)  该注解表示我们自定义的注解保存的范围,RUNTIME表示会保存在class字节码文件中,并会被jvm解析
@interface 这个比较特殊,当我们自定义的注解编译成class文件时可以发现,其实是继承了jdk提供的Annotation接口

我们还在注解中定义了两个属性,name,age

 

2、定义注解解析类PropertiesResolve

package com.xiao.annotion;

import java.lang.reflect.Field;

/**
 * @Description 注解解析类
 * @Auther: 笑笑是一个码农
 * @Date: 23:17 2020/4/26
 */
public class PropertiesResolve {


    public static Object resolve(Class<?> clazz) throws NoSuchFieldException, IllegalAccessException, InstantiationException {

        // 获取类对象上的注解对象
        Properties properties = clazz.getAnnotation(Properties.class);

        // 反射创建对象实例
        Object o = clazz.newInstance();

        // 反射获取注解中属性值
        int age = properties.age();
        String name = properties.name();

        // 获取类对象中的属性
        Field declaredName = clazz.getDeclaredField("name");
        declaredName.setAccessible(true);
        Field declaredAge = clazz.getDeclaredField("age");
        declaredAge.setAccessible(true);

        // 把注解中的属性值设置到对象的属性中
        declaredName.set(o, name);
        declaredAge.set(o, age);
        //返回该对象
        return o;
    }

}

 

3、定义Person类,使用我们的自定义注解

package com.xiao.annotion;

/**
 * @Description
 * @Auther: 笑笑是一个码农
 * @Date: 23:13 2020/4/26
 */
@Properties(name = "笑笑", age = 18)
public class Person {


    private String name;

    private int age;

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

我们使用自定义注解给Person的name属性个age属性赋值

 

4、测试

package com.xiao.annotion;

/**
 * @Description 注解测试
 * @Auther: 笑笑是一个码农
 * @Date: 23:28 2020/4/26
 */
public class Test {

    public static void main(String[] args) throws IllegalAccessException,
            NoSuchFieldException, InstantiationException, ClassNotFoundException {
        
        Person resolve = (Person)PropertiesResolve.resolve(Class.forName("com.xiao.annotion.Person"));
        System.out.println(resolve);
    }
}

结果如下:

可以看到,我们在注解的属性中定义的值成功赋值给Person类中的属性。

以上只是一个简单的示例,注解的定义还有更多的用途,这就要靠大家自己开动脑筋咯~、

 

 


欢迎关注我的个人公众号“笑笑是一个码农”,第一时间获取最新文章。

您的关注,就是支持我持续写作的最大动力!

还可以免费领取前后端全站学习视频资料呦~

个人微信号,如需添加微信,请备注来源,因为妈妈从小就告诉我不要随便跟陌生人聊天!(嘿嘿~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值