AI摘要 本文介绍了Java注解的作用与应用，通过自定义@MyTest注解并结合反射机制，模拟了JUnit框架的运行逻辑。通过遍历类中所有方法，识别并执行被@MyTest标记的方法，展示了注解在程序自动化控制与框架开发中的核心应用。 此内容根据文章生成，仅用于文章内容的解释与总结 Java 注解作用与应用场景模拟Junit框架需求：定义若干个方法，只要加了MyTest注解，就会触发该方法执行。分析：定义一个自定义注解MyTest，只能注解方法，存活范围是一直都在。定义若干个方法，部分方法加上@MyTest注解修饰，部分方法不加模拟一个junit程序，可以触发加了@MyTest注解方法执行package frame; import java.lang.annotation.ElementType; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.annotation.Retention; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @Target(ElementType.METHOD) //注解只能在方法使用 @Retention(RetentionPolicy.RUNTIME) //让注解可以一直存活 @interface MyTest { } public class DEMO { // @MyTest private void test1(){ System.out.println("-----test1-----"); } @MyTest public void test2(){ System.out.println("-----test2-----"); } // @MyTest public void test3(){ System.out.println("-----test3-----"); } @MyTest private void test4(){ System.out.println("-----test4-----"); } public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { Class demoClass = DEMO.class; DEMO demo = new DEMO(); Method[] declaredMethods = demoClass.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { if (declaredMethod.isAnnotationPresent(MyTest.class)){ declaredMethod.setAccessible(true); declaredMethod.invoke(demo); } } } }运行结果-----test2----- -----test4-----
AI摘要 Java注解是代码中的特殊标记，用于辅助程序执行。本文介绍了自定义注解的语法、本质（接口）、元注解（@Target和@Retention）的作用，以及如何通过反射技术解析类、方法等位置的注解信息，实现对程序行为的动态控制。 此内容根据文章生成，仅用于文章内容的解释与总结 Java 注解注解（Annotation）就是Java代码里的特殊标记，比如：@Override、@Test等，作用是：让其他程序根据注解信息来决定怎么执行该程序。注意：注解可以用在类上、构造器上、方法上、成员变量上、参数上等位置自定义注解自己定义注解value: 特殊属性，只有一个value参数(或者其他参数有默认值)可以直接省略value写值模板： public @interface 注解名称{ public 属性类型 属性名() default 默认值; }案例@interface MyTest1 { String aaa(); boolean bbb() default true; String[] ccc(); } @interface MyTest2 { String value(); //特殊属性，只有一个value参数(或者其他参数有默认值)可以直接省略value写值 } @interface MyTest3 { String value(); //特殊属性，只有一个value参数(或者其他参数有默认值)可以直接省略value写值 int age() default 1; } @MyTest1(aaa = "类注解",ccc = {"a","b","c"}) public class AnnotationTest1 { @MyTest1(aaa = "函数注解",ccc = {"aa","bb","cc"}) public void test1(){ } @MyTest2("只有一个value参数(或者其他参数有默认值)可以直接省略value写值2") public void test2(){ } @MyTest3("只有一个value参数(或者其他参数有默认值)可以直接省略value写值3") public void test3(){ } }注解的原理可以查看注解编译后的文件，本质上是接口，里面写的一些属性都是抽象方法字节码文件@interface MyTest1 { String aaa(); boolean bbb() default true; String[] ccc(); } @interface MyTest2 { String value(); } @interface MyTest3 { String value(); int age() default 1; }元注解指的是修饰注解的注解常见的元注解：@Target、@Retention@Target 声明被修饰的注解只能在哪些位置使用@Target(ElementType.TYPE)TYPE，类，接口FIELD，成员变量METHOD，成员方法PARAMETER，方法参数CONSTRUCTOR，构造器LOCAL_VARIABLE,局部变量@Target(ElementType.TYPE) // 当前被修饰的注解只能在类上使用 @interface MyTest4{ } @Target({ElementType.TYPE,ElementType.METHOD}) // 当前被修饰的注解只能在类和方法上使用 @interface MyTest5{ }@Retention 声明注解的保留周期@Retention()SOURCE 只作用在源码阶段，字节码文件中不存在CLASS（默认值） 保留到字节码文件阶段，运行阶段不存在RUNTIME（开发常用） 一直保留到运行阶段@Retention(RetentionPolicy.SOURCE)//只作用在源码阶段，字节码文件中不存在 @interface MyTest6 { } @Retention(RetentionPolicy.CLASS)//保留到字节码文件阶段，运行阶段不存在 @interface MyTest7 { } @Retention(RetentionPolicy.RUNTIME)//一直保留到运行阶段 @interface MyTest8 { }注解的解析判断类上、方法上、成员变量上是否存在注解，并把注解里的内容给解析出来使用反射package Annotations; import java.lang.annotation.*; import java.lang.reflect.Method; import java.util.Arrays; @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface MyTestAnnotation { String value(); double aaa() default 100; String[] bbb(); } @MyTestAnnotation(value = "类注解",aaa = 99.5,bbb = {"a","b"}) class TestClass { @MyTestAnnotation(value = "方法注解",aaa = 199.5,bbb = {"b","a"}) public void test1(){ } } public class MyTestClass{ public static void main(String[] args) throws Exception{ { // 1.获取class对象 Class c = TestClass.class; // 2.解析类上的注解 // 判断类上是否包含了某个注解 if (c.isAnnotationPresent(MyTestAnnotation.class)){ MyTestAnnotation myTestAnnotation = (MyTestAnnotation) c.getDeclaredAnnotation(MyTestAnnotation.class); System.out.println(myTestAnnotation.value()); System.out.println(myTestAnnotation.aaa()); System.out.println(Arrays.toString(myTestAnnotation.bbb())); } } System.out.println("--------------------------"); { // 1.获取class对象 Class c = TestClass.class; Method m = c.getDeclaredMethod("test1"); // 2.解析方法上的注解 // 判断方法上是否包含了某个注解 if (m.isAnnotationPresent(MyTestAnnotation.class)){ MyTestAnnotation myTestAnnotation = (MyTestAnnotation) m.getDeclaredAnnotation(MyTestAnnotation.class); System.out.println(myTestAnnotation.value()); System.out.println(myTestAnnotation.aaa()); System.out.println(Arrays.toString(myTestAnnotation.bbb())); } } } }输出结果类注解 99.5 [a, b] -------------------------- 方法注解 199.5 [b, a]