zoukankan      html  css  js  c++  java
  • 【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();
            }
        }
    }

    运行结果:

  • 相关阅读:
    HTTP 错误 500.19 配置文件错误 ( 0x8007000d,0x80070032)
    system.web下的HttpModules节点和system.webServer下的modules节点的配置区别
    索引超出了数组界限(Microsoft.SqlServer.Smo)
    VS 附加进程调试 Web项目
    VS 调试 无法启动IIS Express Web 服务器(进程不存在)
    java基础面试题
    给dubbo接口添加白名单——dubbo Filter的使用
    mysql行转列转换
    Spring透过ApplicationListener来触发contextrefreshedevent事件
    spring mvc之请求过程源码分析
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5906773.html
Copyright © 2011-2022 走看看