在日常的开发过程中,我们会使用到大量的注解,这些注解使用起来非常的方便快捷,会大大提高我们的编码效率。
但在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类中的属性。
以上只是一个简单的示例,注解的定义还有更多的用途,这就要靠大家自己开动脑筋咯~、
欢迎关注我的个人公众号“笑笑是一个码农”,第一时间获取最新文章。
您的关注,就是支持我持续写作的最大动力!
还可以免费领取前后端全站学习视频资料呦~
个人微信号,如需添加微信,请备注来源,因为妈妈从小就告诉我不要随便跟陌生人聊天!(嘿嘿~)