ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 自定义注解 注解的本质就是接口. 注解的属性名就是接口方法的方法名. 注解的属性值就是接口方法的返回值. 如果一个注解里面只有一个 方法,并且方法名叫value ,那么属性名可以省略不写. ## 自定义注解 定义注解 ~~~ public @interface MyS1 { String value(); } ~~~ 使用注解,如果只有一个方法,方法名是value就可以不写value. ~~~ @MyS1("hello") public void show() { System.out.println(""); } ~~~ ## 元注解 * @Target: 指定该注解可以使用的地方. * @Retention: ## 注解原理 自定义注解 ~~~ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //标记该注解只能使用在方法上 @Target({ElementType.METHOD}) //指定注解的有效时期(源码时期,编译时期,运行时期) @Retention(RetentionPolicy.RUNTIME) public @interface MyS1 { String value(); } ~~~ 使用自定义注解 ~~~ public class main { public static void main(String[] args) throws Exception { //获取所有方法,看看方法有没有被注解修饰 Class clazz = Class.forName("main"); //注意,这里是完全限定名称 //获取所有方法 Method[] methods = clazz.getMethods(); //循环所有方法 for (Method method : methods) { //此方法只对运行时期有效,所以打印出来的结果都是false. 所以要对注解进行注解,可以对注解进行注解的注解被称为元注解. boolean b = method.isAnnotationPresent(MyS1.class); System.out.println(method.getName() + ":" + b); if (b) { method.invoke(clazz.newInstance(), args); } } } @MyS1("hello") public void show1() { System.out.println("show1"); } public void show2() { System.out.println("show2"); } } ~~~ 结果 ``` main:false show1:true show1 show2:false wait:false wait:false wait:false equals:false toString:false hashCode:false getClass:false notify:false notifyAll:false ```