1.定义一个枚举类,后面自定义注解时使用

 package cn.tx.annotation.enums;
/**
* 定义枚举类型
* @author Administrator
*
*/
public enum HttpMethod { GET,POST,PUT,INPUT,DELETE;
}

2. 自定义一个注解 AnnoTest

 package cn.tx.annotation;

 import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import cn.tx.annotation.enums.HttpMethod; /**
* 1.自定义注解,自动实现了java.lang.Annotation接口
* @author Administrator
* 2.注解内部可以定义值,这里的值既不是属性,也不是方法
* 3.语法:数据类型 值的名字();
* 4.注解的意义:当非标识性注解(内部有值的注解)标注在方法上时,当方法被反射调用时,注解才有意义
* 5.@Retention 注解
* @Retention(RetentionPolicy.RUNTIME)
* @Target(ElementType.ANNOTATION_TYPE) public @interface Retention {
* RetentionPolicy value(); }
* RetentionPolicy:注解的策略
* RetentionPolicy.CLASS 表示这个注解能被编译到class文件里,但是运行时不参与运行
* 6.@Target注解——指示注解类型所适用的程序元素的种类
* @Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
ElementType是一个枚举类型
}
* 7. @Target @Retention 只能用在注解的定义上面
* 8.@Documented 指明该注解将被包含在javadoc中
*/ //ElementType.METHOD,表示AnnoTest只能放在方法上面,不能放在类,属性等其他上面
@Target(value = { ElementType.METHOD,ElementType.TYPE })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface AnnoTest { String value();//这里定义了值,在使用注解的地方,就得加上这个值 // Class[]/*String[]*/ location(); // HttpMethod method(); } // enum ElementType {
// /**类,接口,枚举声明 Class, interface (including annotation type), or enum declaration */
// TYPE,
// /**字段声明,包括枚举常量 Field declaration (includes enum constants) */
// FIELD,
// /**方法声明 Method declaration */
// METHOD,
// /** Parameter declaration */
// PARAMETER,
// /** 构造方法声明 Constructor declaration */
// CONSTRUCTOR,
// /**局部变量声明 Local variable declaration */
// LOCAL_VARIABLE,
// /**注解类型声明 Annotation type declaration */
// ANNOTATION_TYPE,
// /**包声明 Package declaration */
// PACKAGE
//}

3.  定义一个Claculate类,对方法使用自定义注解(前提是AnnoTest 注解 设置的@Target(value = { ElementType.METHOD,ElementType.TYPE })  ,也就是该注解能被使用在方法上面。)

 package cn.tx.annotation.test;

 import java.lang.annotation.ElementType;
import java.lang.annotation.Target; import cn.tx.annotation.AnnoTest; public class Caculate {
// @AnnoTest(value = "sss")
//AnnoTest注解中定义了@Target(value = { ElementType.METHOD,ElementType.TYPE })
//如果在属性a上面加@AnnoTest注解,会报:The annotation @AnnoTest is disallowed for this location
private int a; @AnnoTest(value = "相加的结果是:")
public int add(int a,int b){
return a+b;
} }

4. junit测试类:

 package cn.tx.annotation.test;

 import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; import cn.tx.annotation.AnnoTest;
import cn.tx.annotation.enums.HttpMethod; /**
* 常用的表标识性注解:@Test @Override @SuppressWarnings
*
* @author Administrator
*
*/
public class Test { @org.junit.Test
public void test() { } // @AnnoTest(value = "tst")
@Deprecated
// 过时,不建议使用的注解
public void method() { } /**
* @SuppressWarnings压制警告的注解 unchecked 不检查操作时的警告 rawtypes
* 原始类型,也就是不使用泛型,在定义的时候压制泛型的警告
*/
@SuppressWarnings( { "unchecked", "rawtypes" })
public void method1() {
@SuppressWarnings("unused")
List list = new ArrayList();// 不写泛型类型时,会出现黄色波浪线警告!
list.add("lisi");
} @org.junit.Test
// @AnnoTest(value = "test", location = { String.class }, method = HttpMethod.GET)
// 非标识性注解的意义在于方法被反射调用时
public void method3() { } @org.junit.Test
public void testEnum() {
System.out.println(HttpMethod.GET); //执行该方法,控制台打印GET
} @org.junit.Test
public void testAdd(){
new Caculate().add(3, 5); //正常调用,add方法上面的注解不会起作用
} @org.junit.Test
public void testAdd1(){
//获取Caculate类的Class对象,进而获得一个实例,然后获取声明的方法及方法上的注解
Class<?> clazz = Caculate.class;
try {
Object obj = clazz.newInstance();
//getFields()只能获取public的字段,包括父类的。getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
Method method = clazz.getDeclaredMethod("add", int.class,int.class);
//判断一个方法上面是否存在某个注解
boolean isPres = method.isAnnotationPresent(AnnoTest.class);
if(isPres){
//根据一个类获取注解 ,即获得@AnnoTest
AnnoTest annotation = method.getAnnotation(AnnoTest.class);
//获得注解上的值
String value = annotation.value(); //
//反射的方式调用add()方法
Object result = method.invoke(obj, 2,3);
System.out.println(value+result); //控制台输出结果为: 相加的结果是:5
//如果注解上的@Retention(value = RetentionPolicy.SOURCE),运行时时不会有结果的
} } catch (Exception e) {
e.printStackTrace();
} } }

Java自定义注解学习的更多相关文章

  1. java自定义注解学习(二)_注解详解

    上篇文章,我们简单的实现了一个自定义注解,相信大家对自定义注解有了个简单的认识,这篇,这样介绍下注解中的元注解和内置注解 整体图示 内置注解 @Override 重写覆盖 这个注解大家应该经常用到,主 ...

  2. java自定义注解学习(一)_demo小练习

    自定义注解 现在大家开发过程中,经常会用到注解. 比如@Controller 等等,但是有时候也会碰到自定义注解,在开发中公司的记录日志就用到了自定义注解.身为渣渣猿还是有必要学习下自定义注解的. 这 ...

  3. java自定义注解学习(三)_注解解析及应用

    上篇文章已经介绍了注解的基本构成信息.这篇文章,主要介绍注解的解析.毕竟你只声明了注解,是没有用的.需要进行解析.主要就是利用反射机制在运行时进行查看和利用这些信息 常用方法汇总 在Class.Fie ...

  4. java自定义注解学习(注解处理器)

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

  5. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  6. java自定义注解注解方法、类、属性等等【转】

    http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...

  7. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

  8. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  9. Java自定义注解的实现

    Java自定义注解的实现,总共三步(eg.@RandomlyThrowsException): 1.首先编写一个自定义注解@RandomlyThrowsException package com.gi ...

随机推荐

  1. 「PHP开发APP接口实战009」日常安全防范之防SQL入和XSS攻击

    防SQL注入和XSS攻击通用过滤 首先在 /app/library/ 目录下创建 Security.php 文件并添加以下代码: <?php /** * * 防SQL注入和XSS攻击通用过滤 * ...

  2. statistic_action

    方差variance 统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数.V 离差平方和(Sum of Squares of Deviations)是各项与平均项之差的平方的 ...

  3. PHP-图片处理

    开启 GD 扩展(php_gd2.dll) 创建画布 画布:一种资源型数据,可以操作的图像资源. 创建新画布(新建) ImageCreate(宽,高); 创建基于调色板的画布. imageCreate ...

  4. mybatis缓存机制(转)

    缓存在互联网系统中是非常重要的, 其主要作用是将数据保存到内存中, 当用户查询数据 时, 优先从缓存容器中获取数据,而不是频繁地从数据库中查询数据,从而提高查询性能.目 前流行的缓存服务器有Mongo ...

  5. 云计算openstack共享组件——Memcache 缓存系统

    一.缓存系统 静态web页面: 1.工作流程: 在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Reques ...

  6. Java + selenium 元素定位(6)之iframe切换(即对富文本框的操作)

    在元素定位中,对富文本框的元素定位是特别的,当我们使用普通的元素定位方法对富文本框进行操作时,我们会发现不管我们之前介绍的八种方法中的任何方法,我们都不能成功定位到富文本框,并对其进行操作.那是因为富 ...

  7. 【python】 全角半角转换

    以输入为GB18030编码字符串为例: #把全角字符串转半角 def tobanjiao(string): ustring = string.decode('GB18030') rstring = & ...

  8. 20190823 尚硅谷MySQL核心技术

    背景 视频时间:2017.09 MySQL版本:5.5 MySQL基础 命令行启动.停止MySQL: net start MySQL(这里是注册的服务名称) net stop MySQL 命令行连接M ...

  9. Spring学习(一)--简化Java开发,认识Spring

    一.传统Java开发弊端 在传统的开发之中,任何一个有实际意义的应用都会由两个或更多的类所组成,这些类之间相互协调来完成特定的业务逻辑,按照传统的做法,每个对象负责管理与自己相互协作的对象(即他所依赖 ...

  10. let/const及块级作用域

    本系列是在平时阅读.学习.实际项目中有关于es6中的新特性.用发的简单总结,目的是记录以备日后温习:本系列预计包含let/const.箭头函数.解构.常用新增方法.Symbol.Set&Map ...