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("\n\n\n");
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("\n\n\n");
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("\n\n\n");
}
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("\n\n\n");
}
} }
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

运行结果:

【Effective Java】10、java注解使用的更多相关文章

  1. Java 10 - Java Character类

    Java Character类 使用字符时,我们通常使用的是内置数据类型char. 实例 char ch = 'a'; // Unicode for uppercase Greek omega cha ...

  2. 【转】JAVA反射与注解

    转载自:https://www.daidingkang.cc/2017/07/18/java-reflection-annotations/ 前言 现在在我们构建自己或公司的项目中,或多或少都会依赖几 ...

  3. Java学习:注解,反射,动态编译

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解  什么是注解 ? Annotat ...

  4. 【转载】JAVA基础:注解

    原文:https://www.cnblogs.com/xdp-gacl/p/3622275.html#undefined 一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的 ...

  5. java注解学习(1)注解的作用和三个常用java内置注解

    今天,记录一下自己学习的关于注解方面的知识. Annotation是从JDK5.0开始引入的新技术 Annotation的作用: -不是程序本身,可以对程序做出解释(这一点和注释没什么区别) -可以被 ...

  6. Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)

    1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...

  7. Java中的注解及自定义注解你用的怎么样,能不能像我这样应用自如?

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  8. Java之Annotation(注解)——注解处理器

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...

  9. java中的注解(Annotation)

    转载:https://segmentfault.com/a/1190000007623013 简介 注解,java中提供了一种原程序中的元素关联任何信息.任何元素的途径的途径和方法. 注解是那些插入到 ...

  10. java @param参数注解

    注解,@param是参数的解释.如/***@param s 这里表示对s的文字说明,描述 */ public void aa(String s){}一般java中@表示注解,解释一个方法,类,属性的作 ...

随机推荐

  1. 【踩坑经历】一次Asp.NET小网站部署踩坑和解决经历

    2013年给1个大学的小客户部署过一个小型的Asp.NET网站,非常小,用的sqlite数据库,今年人家说要换台服务器,要重新部署一下,好吧,虽然早就过了服务时间,但无奈谁叫人家是客户了,二话不说,上 ...

  2. 基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理

    最近一直很多事情,博客停下来好久没写了,整理下思路,把最近研究的基于Metronic的Bootstrap开发框架进行经验的总结出来和大家分享下,同时也记录自己对Bootstrap开发的学习研究的点点滴 ...

  3. jQuery.noConflict()

    转载:http://blog.163.com/mjuxiaom@126/blog/static/13397047120117324320858/ 运行这个函数将变量$的控制权让渡给第一个实现它的那个库 ...

  4. UNIX/Linux打包,压缩 ,解压:

    1.tar打包命令 ①tar cvf tarname.tar file1 file2 $ .log $ .log $ .log $ tar cvf alllog.tar *.log a .log 0K ...

  5. Docker - Docker国内镜像的配置及使用

    Docker国内镜像 DaoCloud - Docker加速器 阿里云 - 开发者平台 微镜像 - 希云cSphere 镜像广场 - 时速云 灵雀云 网易蜂巢 阿里云的Docker加速器 阿里云 - ...

  6. js每天进步一点点4

    输入数字的验证

  7. Java线程面试题 Top 50 (转载)

    转载自:http://www.cnblogs.com/dolphin0520/p/3958019.html 原文链接:http://www.importnew.com/12773.html   本文由 ...

  8. C# Socket系列二 简单的创建 socket 通信

    看了系列一 我们开启了对socket tcp的监听状态,那么这一章我们来讲解怎么创建socket的通信代码 我新建一个类 TSocketBase public abstract class TSock ...

  9. web框架--bottle

    安装 2 3 4 pip install bottle easy_install bottle apt-get install python-bottle wget http://bottlepy.o ...

  10. Windows Phone 8.1中AppBarToggleButton的绑定问题

    在WP8.1中,应用栏按钮已经可以支持绑定了,而且提供了一种AppBarToggleButton类型,相当于一种开关按钮,这种按钮有一个属性IsChecked,标记是否为选中状态. 于是想当然的,将I ...