【java自定义注解1】java自定义注解-属性
关于自定义注解,以前项目种应用的不多,最近看新项目过程中发现了挺多自定义注解相关内容,使用起来比较巧妙,于是
总结了两种方式,记录如下:
第一种:结合反射进行属性注入,代码如下:
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. 注解解析器:用来解析自定义注解。
*/
public MyAnno {
// 注解的属性
String name() default "rose";String value() default "jack";
}
2、用于属性:
/**
* 一个属性中使用了自定义注解的对象
*/
public class Person {
@MyAnno(name="tom")
private String name;
<span class="hljs-keyword">private</span> <span class="hljs-type">int</span> age;
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getName</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">return</span> name;
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setName</span><span class="hljs-params">(String name)</span> {
<span class="hljs-built_in">this</span>.name = name;
}
<span class="hljs-keyword">public</span> <span class="hljs-type">int</span> <span class="hljs-title function_">getAge</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">return</span> age;
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setAge</span><span class="hljs-params">(<span class="hljs-type">int</span> age)</span> {
<span class="hljs-built_in">this</span>.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());
}
<span class="hljs-comment">/**
* 通过反射获取注解的值
* <span class="hljs-doctag">@param</span> clz
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Person <span class="hljs-title function_">getPerson</span><span class="hljs-params">(Class clz)</span>{
<span class="hljs-type">Person</span> <span class="hljs-variable">person</span> <span class="hljs-operator">=</span><span class="hljs-literal">null</span>;
<span class="hljs-keyword">try</span> {
person = (Person)clz.newInstance();
<span class="hljs-comment">//获取属性</span>
Field[] fields = clz.getDeclaredFields();
<span class="hljs-keyword">for</span>(Field field : fields){
<span class="hljs-comment">//是否被特定注解修饰</span>
<span class="hljs-type">boolean</span> <span class="hljs-variable">fieldHasAnno</span> <span class="hljs-operator">=</span> field.isAnnotationPresent(MyAnno.class);
<span class="hljs-keyword">if</span>(fieldHasAnno){
<span class="hljs-type">MyAnno</span> <span class="hljs-variable">fieldAnno</span> <span class="hljs-operator">=</span> field.getAnnotation(MyAnno.class);
<span class="hljs-comment">//注入注解属性</span>
<span class="hljs-type">String</span> <span class="hljs-variable">name</span> <span class="hljs-operator">=</span> fieldAnno.name();
person.setName(name);
}
}
} <span class="hljs-keyword">catch</span> (InstantiationException e) {
e.printStackTrace();
} <span class="hljs-keyword">catch</span> (IllegalAccessException e) {
e.printStackTrace();
}
<span class="hljs-keyword">return</span> person;
}
<span class="hljs-keyword">private</span> T obj;
<span class="hljs-keyword">public</span> T <span class="hljs-title function_">getObj</span><span class="hljs-params">()</span>{
<span class="hljs-keyword">return</span> obj;
}
<span class="hljs-keyword">public</span> <span class="hljs-title function_">TestClass</span><span class="hljs-params">(T obj)</span> {
<span class="hljs-built_in">this</span>.obj = obj;
}
}
4、执行结果,是注解中的 name 属性的值,测试完成。
tom