【Effective Java】10、java注解使用

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();
        }
    }
}

运行结果:

原文地址:https://www.cnblogs.com/cutter-point/p/5906773.html