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. 使用SQLAlchemy

    使用SQLAlchemy 参考: http://www.sqlalchemy.org/ https://www.keakon.net/2012/12/03/SQLAlchemy%E4%BD%BF%E7 ...

  2. 自定义Image自动切换图像控件

    做这么一个控件,图片自动切换,形成动画效果. 随便的码码,码完发现东西太少了,不过还算完善. public class MyPictureBox : PictureBox { Timer timer ...

  3. XML学习笔记2——DTD

    在上一篇笔记中,将文档类型分类时,曾经根据文档是否使用并遵守了DTD或Schema来区分为格式良好的XML和有效的XML,那么什么是DTD和Schema呢?DTD和Schema都是用来规范XML文档的 ...

  4. jS事件之网站常用效果汇总

    下拉菜单 <!--简单的设置了样式,方便起见,将style和script写到同一个文档,着重练习事件基础--> <!DOCTYPE html> <html> < ...

  5. WPF自定义控件与样式(13)-自定义窗体Window & 自适应内容大小消息框MessageBox

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 自定义 ...

  6. Fiddler的学习

    以下内容转自:http://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html 仅为查找方便而复制~~ Fiddler是最强大最好用的We ...

  7. Trie树的应用:查询IP地址的ISP

    1. 问题描述 给定一个IP地址,如何查询其所属的ISP,如:中国移动(ChinaMobile),中国电信(ChinaTelecom),中国铁通(ChinaTietong)?现有ISP的IP地址区段可 ...

  8. 扩展HT for Web之HTML5表格组件的Renderer和Editor

    在HT for Web提供了一下几种常用的Editor,分别是: slider:拉条 color picker:颜色选择器 enum:枚举类型 boolean:真假编辑器 string:普通的文本编辑 ...

  9. Make something people want

    <黑客与画家>开头首先介绍了书的作者格雷厄姆的其人其事,他的成长涉猎很多,大学学哲学,研究生学计算机,博士时对绘画感兴趣,后来做了两年画家,但是入不敷出,后来他和朋友开始合伙开发一个搭建网 ...

  10. C#抽象类

    抽象类使用abstract修饰符声明: 不能创建抽象类的实例: 抽象类只能用作其他类的基类: 抽象类中可以包含抽象成员和普通的非抽象成员: 抽象类自己可以派生自另外一个抽象类: 任何派生自抽象类的[类 ...