package cn.xf.cp.ch02.item35; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * *功能:这个是我的注解 *时间:下午7:01:27 *文件:CutterPoint.java *@author Administrator * */ /** * 1.SOURCE:在源文件中有效(即源文件保留) 2.CLASS:在class文件中有效(即class保留) 3.RUNTIME:在运行时有效(即运行时保留) */ @Retention(RetentionPolicy.RUNTIME) //定义注解在JVM运行时保留 @Target(ElementType.METHOD) //注解作用在METHOD:用于描述方法 public @interface CutterPoint { public String myAnnotation() default "one cp"; }
测试注解类
package cn.xf.cp.ch02.item35; /** * *功能:这个类用来作为注解的测试类 *时间:下午7:21:34 *文件:Sample3.java *@author Administrator * */ public class Sample3 { @CutterPoint public void anoMethod() { System.out.println("使用注解来运行这个方法吧!!"); } @CutterPoint(myAnnotation="测试第二弹") public void anoMethod2(String ttt) { System.out.println("参数是:" + ttt); } public void noAno() { System.out.println("没有注解"); } @Test public void testAno() { System.out.println("奇怪的注解"); } }
解析注解:
package cn.xf.cp.ch02.item35; import java.lang.reflect.Method; public class CpRun { @org.junit.Test public void anoCp() { try { //获取要进行注解解析的类 Class<?> sample = Class.forName("cn.xf.cp.ch02.item35.Sample3"); //获取默认构造函数,getConstructor()括号中使参数类型,第二个newInstance括号中是参数 Object invokeCon = sample.getConstructor().newInstance(new Object[]{}); //类中定义的所有方法 Method sampleMethod[] = sample.getDeclaredMethods(); Method sampleOne; for(int i = 0; i < sampleMethod.length; ++i) { sampleOne = sampleMethod[i]; if(sampleOne.getAnnotations().length == 0) { System.out.println("*******************************************************************"); //没有注解 sampleOne.invoke(invokeCon); System.out.println("*******************************************************************"); System.out.println(" "); continue; } if(!sampleOne.isAnnotationPresent(CutterPoint.class)) { System.out.println("*******************************************************************"); //其他注解 //如果是这个注解 System.out.println(sampleOne.getName() + "方法:这里未注明注解,开始业务。。。。。。。"); //没有注解 sampleOne.invoke(invokeCon); System.out.println("注解=" + sampleOne.getDeclaredAnnotations()[0].toString()); System.out.println(sampleOne.getName() + "方法:这里未注明注解,结束业务。。。。。。。"); System.out.println("*******************************************************************"); System.out.println(" "); continue; } if(sampleOne.getParameterTypes().length == 0) { System.out.println("*******************************************************************"); //没没有参数 //如果是这个注解 System.out.println(sampleOne.getName() + "方法:这里读出了CutterPoint注解,开始业务。。。。。。。"); //没有注解 sampleOne.invoke(invokeCon); System.out.println("注解=" + sampleOne.getDeclaredAnnotations()[0].toString()); CutterPoint cp = (CutterPoint) sampleOne.getAnnotation(CutterPoint.class); System.out.println("注解值:myAnnotation=" + cp.myAnnotation()); System.out.println(sampleOne.getName() + "方法:这里读出了CutterPoint注解,结束业务。。。。。。。"); System.out.println("*******************************************************************"); System.out.println(" "); } else { System.out.println("*******************************************************************"); //有一个参数的 //没没有参数 //如果是这个注解 System.out.println(sampleOne.getName() + "方法:这里读出了CutterPoint注解带参数,开始业务。。。。。。。"); //没有注解 sampleOne.invoke(invokeCon, new Object[]{"试一试反射调用方法"}); System.out.println("注解=" + sampleOne.getDeclaredAnnotations()[0].toString()); CutterPoint cp = (CutterPoint) sampleOne.getAnnotation(CutterPoint.class); System.out.println("注解值:myAnnotation=" + cp.myAnnotation()); System.out.println(sampleOne.getName() + "方法:这里读出了CutterPoint注解带参数,结束业务。。。。。。。"); System.out.println("*******************************************************************"); System.out.println(" "); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行结果: