【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. 注解解析器:用来解析自定义注解。
    */
    @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;
<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