关于自定义注解,以前项目种应用的不多,最近看新项目过程中发现了挺多自定义注解相关内容,使用起来比较巧妙,于是

总结了两种方式,记录如下:

第一种:结合反射进行属性注入,代码如下:

1、定义一个注解:

package com.xxx.ann.simple;

import java.lang.annotation.*;
/**
* 1.注解的定义:Java文件叫做Annotation,用@interface表示。
*
* 2.元注解:@interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。
*
* 3.注解的保留策略:
*
*   @Retention(RetentionPolicy.SOURCE) // 注解仅存在于源码中,在class字节码文件中不包含
*
*   @Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
*
*   @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
*
* 4.注解的作用目标:
*
*   @Target(ElementType.TYPE) // 接口、类、枚举、注解
*
*   @Target(ElementType.FIELD) // 字段、枚举的常量
*
*   @Target(ElementType.METHOD) // 方法
*
*   @Target(ElementType.PARAMETER) // 方法参数
*
*   @Target(ElementType.CONSTRUCTOR) // 构造函数
*
*   @Target(ElementType.LOCAL_VARIABLE) // 局部变量
*
*   @Target(ElementType.ANNOTATION_TYPE) // 注解
*
*   @Target(ElementType.PACKAGE) // 包
*
* 5.注解包含在javadoc中:
*
*   @Documented
*
* 6.注解可以被继承:
*
*   @Inherited
*
* 7.注解解析器:用来解析自定义注解。
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnno {
//注解的属性
String name() default "rose"; String value() default "jack";
}

2、用于属性:

/**
* 一个属性中使用了自定义注解的对象
*/
public class Person {
@MyAnno(name="tom")
private String name; private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

3、测试类与注解值得获取:

/**
* 测试类
* @param <T>
*/
public class TestClass<T> {
/**
* 主方法
* @param args
*/
public static void main(String[] args) {
Person person = getPerson(Person.class); System.out.println(person.getName());
} /**
* 通过反射获取注解的值
* @param clz
* @return
*/
public static Person getPerson(Class clz){
Person person =null;
try {
person = (Person)clz.newInstance();
//获取属性
Field[] fields = clz.getDeclaredFields();
for(Field field : fields){
//是否被特定注解修饰
boolean fieldHasAnno = field.isAnnotationPresent(MyAnno.class);
if(fieldHasAnno){
MyAnno fieldAnno = field.getAnnotation(MyAnno.class);
//注入注解属性
String name = fieldAnno.name();
person.setName(name); }
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} return person;
} private T obj; public T getObj(){
return obj;
} public TestClass(T obj) {
this.obj = obj;
}
}

4、执行结果,是注解中的name属性的值,测试完成。


tom

【java自定义注解1】java自定义注解-属性的更多相关文章

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

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

  2. 深入JAVA注解(Annotation):自定义注解 (转)

    原文出自:http://blog.csdn.net/yjclsx/article/details/52101922 一.基础知识:元注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义 ...

  3. java之aop使用及自定义注解

    目的: 1.Java注解简介 2.Java元注解(重点) 3.自定义注解 案例一(获取类与方法上的注解值) 案例二(获取类属性上的注解属性值) 案例三(获取参数修饰注解对应的属性值) 4.Aop自定义 ...

  4. Java注解Annotation与自定义注解详解

    Java注解简介 开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的应用场景和如何自定义注解. 下面列举开发中常见的注解 @Override:用于标识 ...

  5. Java注解教程:自定义注解示例,利用反射进行解析

    Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解. 注解是Java 1.5引入 ...

  6. Java注解教程及自定义注解

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

  7. [Java]利用拦截器和自定义注解做登录以及权限验证

    1.自定义注解 需要验证登录的注解 package com.etaofinance.wap.common; import java.lang.annotation.Documented; import ...

  8. java 日志脱敏框架 sensitive-v0.0.4 系统内置常见注解,支持自定义注解

    项目介绍 日志脱敏是常见的安全需求.普通的基于工具类方法的方式,对代码的入侵性太强.编写起来又特别麻烦. 本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发. 特性 基于注解的日志脱敏. 可 ...

  9. 160621、Java注解教程及自定义注解

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

  10. Java日志脱敏框架 sensitive-v0.0.4 系统内置常见注解,支持自定义注解

    项目介绍 日志脱敏是常见的安全需求.普通的基于工具类方法的方式,对代码的入侵性太强.编写起来又特别麻烦. 本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发. 特性 基于注解的日志脱敏. 可 ...

随机推荐

  1. 王立平--android这四个组成部分

    Android中称为四大组件的为别为:Activity/Service/BroadCast Recevicer/Content  provider Activity:activity是用户和应用程序交 ...

  2. spring boot 集成mybatis报错Missing artifact

    1. pom文件中的oracle依赖提示Missing artifact,需要手动下载并导入maven参考 oracle依赖下载地址 (ojdbc6.jar) cd到下载的ojdbc6.jar所在路径 ...

  3. dotnet pack 打包文件版本号引起 "Could not load file or assembly" 问题

    如果不是遇到,真的不会想到,代码世界的问题真是千奇百怪,这次遇到的是 dotnet pack 打包文件版本号引起的问题. 之前进行 nuget 打包都是在 Visual Studio build 时进 ...

  4. WPF刷新界面

    Winform 里有 Application.DoEvents();可刷新! WPF 里没这个,尽管可用委托实现多线程,但是刷新还是不行! 后来找到了 类似App.DoEvents()的方法(): 代 ...

  5. 数据绑定(九)Binding的数据校验

    原文:数据绑定(九)Binding的数据校验 Binding用ValidationRules属性来校验数据的有效性,ValidationRules属性类型是Collection<Validati ...

  6. win10应用程序添加到开机启动项的两种解决办法

    原文 win10应用程序添加到开机启动项的两种解决办法 在windows10系统中,如果想让应用程序在开机之后自动运行起来,可以怎么做呢? 方法一: 1.首先创建应用程序的快捷方式 找到自己想加入开机 ...

  7. C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装

    原文:C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装 1.SocketAsyncEventArgs介绍 SocketAsyncEventArgs是微软提供的高性能 ...

  8. 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项。

    “/”应用程序中的服务器错误. 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项. 说明: 执行当 ...

  9. Window文件目录遍历 和 WIN32_FIND_DATA 结构(非常详细的中文注释)

    第一部分     *百度百科提供的内容总结:WIN32_FIND_DAT 第二部分   *程序实例 第三部分   *一篇使用FindFirstFile和FindNextFile函数的博文   第一部分 ...

  10. Qt 跨UI线程的数据交换和信号-槽调用实现方案汇总

    一.目录 转载1: http://my.oschina.NET/fanhuazi/blog/737224?ref=myread 点击打开链接 转载2: http://www.qtcn.org/bbs/ ...