java进阶(42)--注解

文档目录:

一、概念

二、注解的使用方法

三、JDK内置注解

四、元注释

五、注解中定义属性

六、反射注解的对象

七、反射注解对象的属性值

---------------------------------------分割线:正文--------------------------------------------------------

一、概念

1、注解即注释:Annotation

2、引用数据类型,编译之后包生成xxx.class文件

3、自定义注解:语法[修饰符列表]@interface 注解类型名{}

 

二、注解的使用方法

1、注解使用时语法格式:@注解类型名

2、注解可以出现在类、属性、方法、变量等几乎任意类型上

 

三、JDK内置注解

1、@Deprecated注解

表示注解的元素已过时,有更好的解决方案

 

2、@Override注解

只能注解方法,给编译器参考的,如果不是重写父类方法时编译器会报错

复制代码
1     @Override
2     public String toString() {
3         return "AnnotationTest01{" +
4                 "no=" + no +
5                 '}';
6     }
复制代码

 

四、元注释

注解注解的注解

1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.SOURCE)
3 public @interface Override {
4 }

1、@Target注解

用来标注的注解可以出现在哪些位置上

2、@Retention注解

表示该注解被保存的位置

 

五、注解中定义属性

1、如果一个注解中有属性,那必须给属性赋值,除非属性有defalut默认值

注解:

复制代码
package com.bk.java.Test42;

public @interface MyAnnotation {
    String name();
    int no() default 1;
}
复制代码

测试程序:

复制代码
 1 package com.bk.java.Test42;
 2 
 3 public class AnnotationTest01 {
 4     @MyAnnotation(name="test01")
 5     private int no;
 6     public static void m1(){
 7         int i=100;
 8     }
 9     public AnnotationTest01(){
10     }
11 
12     public String toString() {
13         return "AnnotationTest01{" +
14                 "no=" + no +
15                 '}';
16     }
17 }
复制代码

2、如果属性值是value且只有一个属性时,使用时可以省略。

注解:

package com.bk.java.Test42;

public @interface MyAnnotation {
    String value();
}

测试程序:

复制代码
 1 package com.bk.java.Test42;
 2 
 3 public class AnnotationTest01 {
 4     @MyAnnotation("testvalue01")
 5     private int no;
 6     @MyAnnotation(value = "testvalue02")
 7     public static void m1(){
 8         int i=100;
 9     }
10     public AnnotationTest01(){
11     }
12 
13 }
复制代码

3、注解的属性类型为数组

注解中可以使用的类型为:

byte、short、int、long、float、double、boolean、char、String、Class以及每一种的数组形式

注解:

package com.bk.java.Test42;

public @interface MyAnnotation {
    String value();
}

测试程序:当数组只有一个类型时,大括号可以省略

复制代码
1 package com.bk.java.Test42;
2 
3 public class OtherAnnotationTest01 {
4     @OtherAnnotation(age = 10,email = {"zhang@123.com","li@qq.com"})
5     public void doSome(){}
6     @OtherAnnotation(age=25,email = "wang@wangyi.com")
7     public void doOther(){}
8 }
复制代码

 

六、反射注解的属性值

注解:

复制代码
package com.bk.java.Test42;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation02 {
    String Value() default "北京";
}
复制代码

注解测试:

复制代码
package com.bk.java.Test42;

@MyAnnotation02
public class MyAnnotationTest02 {

    int i;
    public MyAnnotationTest02(){
    }
    @MyAnnotation02
    public void  doSome(){
        int i;
    }
}
复制代码

测试反射注解:

复制代码
 1 package com.bk.java.Test42;
 2 
 3 public class ReflectAnnotationTest02 {
 4     public static void main(String[] args) throws ClassNotFoundException {
 5         //获取类
 6         Class c= Class.forName("com.bk.java.Test42.MyAnnotationTest02");
 7         //判断是否此类是否有注解对象
 8         if(c.isAnnotationPresent(MyAnnotation02.class)){
 9             MyAnnotation02 myAnnotation02=(MyAnnotation02)c.getAnnotation(MyAnnotation02.class);
10             System.out.println("类上的注解对象"+myAnnotation02);
11             //获取注解对象的属性
12             String value=myAnnotation02.Value();
13             System.out.println(value);
14         }
15     }
16 }
复制代码

查看代码运行结果:

类上的注解对象@com.bk.java.Test42.MyAnnotation02(Value=北京)
北京

 

七、反射方法上的注解信息

注解:

复制代码
 1 package com.bk.java.Test42;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 @Target(ElementType.METHOD)
 9 @Retention(RetentionPolicy.RUNTIME)
10 public @interface MyAnnotation03 {
11     String username();
12     String password();
13 }
复制代码

注解测试:

复制代码
 1 package com.bk.java.Test42;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 public class MyAnnotationTest03 {
 6     @MyAnnotation03(username="admin",password = "123")
 7     public void doSome(){};
 8 
 9     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
10         Class c=Class.forName("com.bk.java.Test42.MyAnnotationTest03");
11         //获取doSome方法
12         Method doSomeMethod=c.getDeclaredMethod("doSome");
13         //判断方法上是否有这个注解
14         if(doSomeMethod.isAnnotationPresent(MyAnnotation03.class)){
15             MyAnnotation03 myAnnotation03=doSomeMethod.getAnnotation(MyAnnotation03.class);
16             System.out.println(myAnnotation03.username());
17             System.out.println(myAnnotation03.password());
18         }
19     }
20 }
复制代码

查看运行结果:

admin
123

 

posted @   Mrwhite86  阅读(113)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示