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. 一条Select语句丛生到死的处理过程

    以一条普通的“select * from table order by …”语句为例.图2-21中显示为该语句在数据库中各个组件之间的处理过程,各个步骤分别代表: (1)select语句通过网络传送给 ...

  2. 细数改善WPF应用程序性能的10大方法

    WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系 ...

  3. 【博客美化】06.添加QQ交谈链接

    博客园美化相关文章目录: [博客美化]01.推荐和反对炫酷样式 [博客美化]02.公告栏显示个性化时间 [博客美化]03.分享按钮 [博客美化]04.自定义地址栏logo [博客美化]05.添加Git ...

  4. Oracle IF & CASE语句

    IF语句主要有以下三种基本形式: 一. IF-THEN语句 IF CONDITION THEN           STATEMENT 1;           ...           STATE ...

  5. Cocos2d-x 3.2 学习笔记(十二)TimberMan!疯狂伐木工!

    学习cocos2dx有一段时间了,试着做了2048游戏,最近又发现个经典游戏,啥也不说果断开工做自己的游戏——TimberMan! 首先说明:游戏资源摘自同类游戏,感谢这些游戏的资源让我完成自己的开发 ...

  6. 转载--How to Install VMware Tools on CentOS 6.3

    源地址:http://www.ehowstuff.com/how-to-install-vmware-tools-on-centos-6-3/ VMware Tools is a group of u ...

  7. jQuery.Deferred 源码分析

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong ) 1 引子 观察者模式是我们日常开发中经常用的模式.这个模式由两个主要部分组成:发布者和观察者.通过观察者模式, ...

  8. Google C++ 风格指南 命名约定 转

    命名约定 最重要的一致性规则是命名管理. 命名风格快速获知名字代表是什么东东: 类型? 变量? 函数? 常量? 宏 ... ? 甚至不需要去查找类型声明. 我们大脑中的模式匹配引擎可以非常可靠的处理这 ...

  9. 用Qt写软件系列五:一个安全防护软件的制作(1)

    引言 又有许久没有更新了.Qt,我心爱的Qt,为了找工作不得不抛弃一段时间,业余时间来学一学了.本来计划要写一系列关于Qt组件美化的博文,但是写了几篇之后就没坚持下去了.技术上倒是问题不大,主要是时间 ...

  10. MVC学习之前必须掌握的c#基础知识

    一.类自动属性 public class Person { //自动属性 public string Name { get; set; } private int _age; public int a ...