【java自定义注解1】java自定义注解-属性
2024-08-31 23:55:53
关于自定义注解,以前项目种应用的不多,最近看新项目过程中发现了挺多自定义注解相关内容,使用起来比较巧妙,于是
总结了两种方式,记录如下:
第一种:结合反射进行属性注入,代码如下:
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
最新文章
- jquery在线扫雷
- SELECT控件操作的JS代码示例
- Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式
- 集群服务器 时间同步 - Chrony
- Android Spinner控件数据绑定
- js 选项卡实现
- 图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别
- hibernate持久化操作注意
- c++ smart pointer
- php:兄弟连之面向对象版图形计算器1
- CodeForces 447C DZY Loves Sequences DP
- UVA 707 - Robbery(内存搜索)
- WebForm和Asp.Net MVC的理解
- Android UI(四)云通讯录项目之云端更新进度条实现
- 2D射影空间,为何引入射影空间
- log4net写入日志到sqlserver数据库
- MUI 拍照或选取照片上传作为头像
- 基于Java对图片进行二值化处理
- December 03rd 2016 Week 49th Saturday
- SharePoint自动化系列——通过PowerShell创建SharePoint List Items
热门文章
- lua转换etcd应答
- 在IIS上部署.net core的webapi项目 以及502.5错误的两种解决方法
- C++于public、protected和private说明(From MSDN)
- 图形化界面安装oracle报错Could not execute auto check for display colors using command /usr/bin/xdpyinfo. Check if the DISPLAY variable is set.
- You don&#39;t have permission to access / on this server问题的解决.
- JAVASCRIPT高程笔记-------第六章 面向对象的程序设计
- C++的中英文字符串表示(string,wstring),使用wcout.imbue(std::locale(";chs";));本地化解析编码
- php 获取今日、昨日、本周,上周、本月,上月,季度的起始时间戳和结束时间戳的方法
- mariadb 允许远程访问
- iOS9 Spotlight使用