目录
本文章主要讲解什么是注解的解析、以及注解的解析应用场景(代码演示)、用注解和反射模拟junit框架代码演示
不清楚注解和反射的同学可以先看我之前发的文章哦
1、什么是注解的解析?
就是判断类上、方法上、成员变量上是否存在注解,并把注解里面的内容给解析出来
2、解析注解的案例
1、自定义一个注解
java
@Target({ElementType.TYPE,ElementType.METHOD}) //作用范围为类和方法
@Retention(RetentionPolicy.RUNTIME) //运行时有效
public @interface MyAnnotation {
String value();
double aaa() default 100;
String[] bbb();
}
2、在类和方法上使用自己定义的注解
java
@MyAnnotation(value = "大美丽",bbb={"爱漂亮","很精致"})
public class MyClass {
@MyAnnotation(value = "小林子",aaa = 200,bbb={"爱学习","很努力"})
private String myMethod(){
return "一个成员方法而已";
}
}
3、解析注解
三部曲:
1、得到需要解析的类的class对象,进而获取该类指定 方法名
2、判断类或者方法上是否有该注解isAnnotationPresent()
3、获取指定的注解对象getDeclaredAnnotation()
java
public class AnalysisAnnotation {
public static void main(String[] args) throws Exception {
//1、先得到需要解析的类的class对象
Class myClassClass = MyClass.class;
//判断类上是否有这个MyAnnotation注解
if (myClassClass.isAnnotationPresent(MyAnnotation.class)){
//获取指定的注解对象
MyAnnotation myAnnotation = (MyAnnotation)myClassClass.getDeclaredAnnotation(MyAnnotation.class);
System.out.println(myAnnotation.aaa());
System.out.println(myAnnotation.value());
System.out.println(Arrays.toString(myAnnotation.bbb()));
}
System.out.println("=========");
Method declaredMethod = myClassClass.getDeclaredMethod("myMethod");
//判断方法上是否有这个MyAnnotation注解
if (declaredMethod.isAnnotationPresent(MyAnnotation.class)){
//获取指定的注解对象
MyAnnotation myAnnotation = (MyAnnotation)declaredMethod.getDeclaredAnnotation(MyAnnotation.class);
System.out.println(myAnnotation.aaa());
System.out.println(myAnnotation.value());
System.out.println(Arrays.toString(myAnnotation.bbb()));
}
}
}
运行该方法,可以看到控制台的打印,正是我们使用注解是传入的值。
3、模拟Junit框架案例
实现方式:注解结合反射的方式
1、自定义一个MyTest注解
java
@Target(ElementType.METHOD) //表示只能作用在方法上
@Retention(RetentionPolicy.RUNTIME) //表示生命为运行时有效
public @interface MyTest {
}
2、定义一个测试类,使用自定义的注解
其中方法test2()、test3()是没有加注解的
java
public class JunitTest {
//使用Junit框架必须是公开无参数无返回值的
//我们使用自己的注解
@MyTest
public void test1(){
System.out.println("我是test1");
}
public void test2(){
System.out.println("我是test2");
}
public void test3(){
System.out.println("我是test3");
}
@MyTest
public void test4(){
System.out.println("我是test4");
}
}
3、写一个启动类
我们需要启动加了注解的方法,没有加注解的方法则不启动。
注意看代码注释
java
public static void main(String[] args) throws Exception {
JunitTest junitTest = new JunitTest();
//1、获取JunitTest类的class文件
Class junitTestClass = JunitTest.class;
//2、获取该类的所有方法
Method[] declaredMethods = junitTestClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
//3、判断该方法是否加了@MyTest注解
if (declaredMethod.isAnnotationPresent(MyTest.class)){
//4、如果已经包含该注解,则该方法启动。记住方法是依赖于对象的,所以我们得实例化一个对象传进去。
declaredMethod.invoke(junitTest);
}
}
}
执行该启动类,可以看到只有加了@MyTest注解的方法才会执行
注解是用来标记程序,是为了让其他程序根据注解信息决定怎么去对待它们。
例如Junit框架案例,加了注解就执行,不加注解就不执行。
以上就是我对如何自定义框架的理解啦,希望能帮到大家,有问题的地方欢迎大家一起讨论!
后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤