文档目录:
---------------------------------------分割线:正文--------------------------------------------------------
1、注解即注释:Annotation
2、引用数据类型,编译之后包生成xxx.class文件
3、自定义注解:语法[修饰符列表]@interface 注解类型名{}
1、注解使用时语法格式:@注解类型名
2、注解可以出现在类、属性、方法、变量等几乎任意类型上
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