一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JAVA自定義注解詳情

JAVA自定義注解詳情

2022-02-17 15:10java-zh Java教程

這篇文章主要介紹了Java自定義注解,結合實例形式總結分析了java常見的自定義注解類型、功能、用法及操作注意事項,需要的朋友可以參考下

原理:

注解的本質是繼承Annotation的特殊接口,其具體實現類是Java運行時生成的動態代理類.而我們通過反射獲取注解時,返回的是Java運行時生成的動態代理對象Proxy1,通過動態代理對象,調用自定義注解(接口)的方法,最終會調用AnnotationInvocationHandler 的invoke方法.

元注解:

  • @Documented:是否將注解包含到JavaDoc中
  • @Retention:什么時候使用該注解,表明注解的生命周期
  • @Target:注解用于什么地方
  • @Inherited:是否允許子類繼承改注解

@Retention參數講解:

RetentionPolicy.SOURCE:在編譯階段丟棄,這些注解在編譯結束后就不會再有意義,所以它不會寫入字節碼.比如@Override, @SuppressWarnings都屬于這類注解。

RetentionPolicy.CLASS:在類加載的時候丟棄, 包含在類文件中

RetentionPolicy.RUNTIME:包含在類文件中,在運行時可以被獲取到

@Target:參數講解:

ElementType.TYPE:用于類,接口,枚舉

ElementType.FIELD:應用于屬性

ElementType.METHOD:應用于方法

ElementType.PARAMETER:用于方法的形式參數

ElementType.CONSTRUCTOR:用于構造函數

ElementType.LOCAL_VARIABLE:應用于局部變量

ElementType.ANNOTATION_TYPE:應用于注解類型

ElementType.PACKAGE:應用于包

ElementType.TYPE_PARAMETER:應用于類型變量(1.8新增)

ElementType.TYPE_USE:1.8版本新增,應用于任何使用類型的語句中

案例:

給一個類的String屬性設置默認值

?
1
2
3
4
5
6
7
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ObjectFlag {
    //默認值
    String value() default "默認值1";
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ObjectTest {
    @ObjectFlag
    String name;
    @ObjectFlag
    Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ObjectRun {
  public static <T> T setValueField(T t) throws IllegalAccessException {
        Class<?> cls = t.getClass();
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            boolean hasConfigField = field.isAnnotationPresent(ObjectFlag.class);
            field.setAccessible(true);//設置可以訪問私有變量
            //若屬性上有注解,使用注解的值作為key去配置文件中查找
            if (hasConfigField) {
                //獲取注解的默認值
                Object annoValue = field.getAnnotation(ObjectFlag.class).value();
                System.out.println("當前的屬性名稱為:" + field.getName());
                System.out.println("當前屬性類型:" + field.getGenericType().toString());
                //獲取到屬性的數據類型
                String type = field.getGenericType().toString();
                if (type.endsWith("String")) {//如果是字符串類型
                    field.set(t, annoValue.toString());
                }
            } else //若屬性上沒有注解,則使用屬性名作為key去配置文件中查找
                System.out.println("屬性" + field.getGenericType().toString() + "沒有該注解");
            }
        }
        return t;
    }
}

運行結果:

JAVA自定義注解詳情

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之際的更多內容!

原文鏈接:https://blog.csdn.net/qq_36138652/article/details/117107821

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人精品高清在线观看99 | 欧美男同videos | 美女女女女女女bbbbbb毛片 | 小早川怜子在线播放精品 | 40分钟在线观看免费 | 男同志与动人物zozotv | 天天综合亚洲 | 美女班主任下面好爽好湿好紧 | 91制片厂制作传媒免费版樱花 | 调教女秘书 | 9久热久爱免费精品视频在线观看 | 99久久精品免费看国产四区 | 啪一啪在线视频 | 色老板最新网站视频地址 | 黄瓜视频导航 | 深夜福利免费观看 | 亚洲精品乱码久久久久久蜜桃 | avidolz性教师 | 亚洲AV蜜桃永久无码精品红樱桃 | 久久人妻少妇嫩草AV無碼 | 久久性综合亚洲精品电影网 | 久久久伊人影院 | 高清毛片一区二区三区 | 美女扒开胸罩露出胸大乳 | 大陆国语自产精品视频在 | 非洲黑人bbwbbwbbw | 亚洲 另类 欧美 变态屎尿 | 成年人黄视频在线观看 | 国产精品自在线 | 东京道一本热大交乱 | 91九色麻豆 | 国产亚洲自愉自愉 | www.四虎com| 冰漪丰满大乳人体图片欣赏 | 日本高清全集免费观看 | a级情欲片在线观看hd | 欧美乱子伦xxxx12在线 | 香蕉国产人午夜视频在线观看 | 亚洲欧美日韩天堂在线观看 | 国产欧美一区二区精品性色 | 顶级欧美做受xxx000大乳 |