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

    运行结果:

  • 相关阅读:
    recon-ng打开后显示No modules enabled/installed
    mysql的floor()报错注入方法详细分析
    视频合并时使用python批量修改文件名
    ThinkPHP5框架引入的css等外部资源文件没有生效
    用session实现的用户登陆,客户端是怎样获取到cookie信息的
    关于Linux系统下基于Tomcat部署和升级war包的详细过程
    nginx代理的页面性能优化大全
    linux下MySQL数据库的定时备份与定时删除
    关于linux查询内存,CPU,存储空间和日志查询的的常用命令及参数讲解
    linux 查看cpu核心数
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5906773.html
Copyright © 2011-2022 走看看