一 : 新建MyAnnotation 注解
/**
* 自定义注解:仅仅是标注,不具有运行逻辑
* @Target() 指定注解针对的地方
* @Retention() 指定注解保留区域
* @MyAnnotation() 自定义注解
*/
//@Target(ElementType.TYPE) // 类、接口
//@Target(ElementType.FIELD) // 成员变量
@Target(ElementType.METHOD) // 成员方法
//@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD}) // 成员方法,类
//@Target(ElementType.PARAMETER) // 方法参数
//@Target(ElementType.CONSTRUCTOR) // 构造器
//@Target(ElementType.PACKAGE) // 包
//@Target(ElementType.ANNOTATION_TYPE) // 注解
//@Retention(RetentionPolicy.SOURCE) // 源代码级别,由编译器处理,处理之后不再保留
//@Retention(RetentionPolicy.CLASS) // 注解信息保留到类对应的class文件中
@Retention(RetentionPolicy.RUNTIME) // 由jvm读取,运行时使用
public @interface MyAnnotation {
// String value() default ""; // 如果需要接收值,不需要接受值可以不写这个
}
二 : 新建 测试类 InitDemo ,包含 注解标记的处理逻辑
public class InitDemo {
@MyAnnotation
public void init() {
System.out.println("init方法执行了......");
}
public static void main(String[] args) throws Exception {
/*
方法注解
*/
// 通过反射 获取 Class 类
Class aClass = Class.forName("com.example.Dog");
// 获取 Class 所有方法
Method[] methods = aClass.getMethods();
// 遍历 methods
if (methods != null) {
for (Method method : methods) {
// 判断方法 是否有某个注解
boolean isMyAnnotation = method.isAnnotationPresent(MyAnnotation.class);
System.out.println(method.getName() + "方法时候有MyAnnotation注解:" + isMyAnnotation);
// 拥有注解
if (isMyAnnotation) {
// 调用方法
method.invoke(aClass.getConstructor(null).newInstance(null), null);
}
}
}
/*
类注解 , 属性注解
*/
// 通过反射 获取 Class 类
Class<Dog> dogClass = Dog.class;
// 判断对象是否有某个注解
MyAnnotation annotation = dogClass.getAnnotation(MyAnnotation.class);
if (annotation != null) {
// 创建对象
Constructor<Dog> constructor = dogClass.getConstructor(null);// 拿到构造器
Dog dog = constructor.newInstance(null); // 获取对象
// 开始赋值
//dogClass.getField()// 获取公用属性
Field[] declaredFields = dogClass.getDeclaredFields();// 获取全部私有属性
for (Field declaredField : declaredFields) {
MyAnnotation annotation1 = declaredField.getAnnotation(MyAnnotation.class);
if (annotation1 != null) {
declaredField.setAccessible(true); // 暴力反射(否则下面会报异常,因为是私有的)
String value = annotation1.value();
// 判断属性的类型
switch (declaredField.getType().getName()) {
case "java.lang.Integer": {
Integer val = Integer.parseInt(value);
declaredField.set(dog, val); // 给目标对象赋值
break;
}
default:
declaredField.set(dog, value); // 给目标对象赋值
}
}
}
} else {
System.out.println(dogClass + "没有添加了MyAnnotation注解");
}
}
}
三 : 执行结果
main方法时候有MyAnnotation注解:false
init方法时候有MyAnnotation注解:true
init方法执行了......
wait方法时候有MyAnnotation注解:false
wait方法时候有MyAnnotation注解:false
wait方法时候有MyAnnotation注解:false
equals方法时候有MyAnnotation注解:false
toString方法时候有MyAnnotation注解:false
hashCode方法时候有MyAnnotation注解:false
getClass方法时候有MyAnnotation注解:false
notify方法时候有MyAnnotation注解:false
notifyAll方法时候有MyAnnotation注解:false