注解与反射
1.注解
1.1什么是注解
Java.Annotation是从JDK5.0开始引入的新技术
-
注解和反射是所有框架的底层实现机制
-
注释是给人看的,注解不仅给人看,还能给程序看
Annotation的作用:
- 不是程序本身,可以对程序做出解释(这一点和注释comment没什么区别)
- 可以被其他程序(比如:编译器等)读取
Annotation的格式:
- @注解名
- 还可以添加参数值,例如
@SuppressWarnings(value=“unchecked”)
Annotation在哪里使用:
- 可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息
- 我们可以通过反射机制编程 实现对这些元数据的访问
1.2内置注解
Java.Annotation有3个内置注解
-
@Override:定义在java.lang.Override中,只能修饰method,表示子类打算覆写父类的方法的声明
-
@Deprecated:定义在java.lang.Deprecated中,可以修饰class、method、field,表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的替代实现
-
@SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息
其需要参数,但是这些参数都是定义好的:
@SuppressWarnings("all") @SuppressWarnings("unchecked") @SuppressWarnings(value={"unchecked","deprecation"}) 等等...
测试:
public class Test01 extends Object{
@Override
public String toString(){
return super.toString();
}
@Deprecated
public static void test02(){
System.out.println("Deprecated");
}
@SuppressWarnings("all")
public void test01(){
System.out.println("SuppressWarnings");
}
public static void main(String[] args) {
test02();
}
}
1.3元注解
-
Java.Annotation定义了4个标准的元注解meta-annotation类型,他们被用来解释对其他注解
@Target: 注解可以被用在哪些地方,如class、method、field; @Retention:注解的生命周期,在什么级别保存该注解信息 source<class<runtime; @Document:说明该注解将被包含在javadoc中; @Inherited:说明子类可以继承父类的注解;
-
4个元注解+@interface 可以自定义注解
public class Test02 { @Myannotation public void test01(){ System.out.println("自定义注解"); } } //定义一个注解,一般只要@Target和@Retention @Target(value={ElementType.TYPE,ElementType.METHOD,ElementType.FIELD}) @Retention(value= RetentionPolicy.RUNTIME) @Documented @Inherited @interface Myannotation{ }
1.4自定义注解
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口
分析:
- @interface用来声明一个注解,格式为:
public @interface 注解名{…}
在类里面声明需要把public去掉 - 其中的配置参数,写成了方法的形式,但是仍是参数。
- 参数类型只能是基本类型,Class,String,enum
- 可以通过default来声明参数的默认值,如空字符串、0
- 如果只有一个参数成员,一般参数名为value
- 注解参数如果没有默认值,就必须有值
测试:
public class Test02 {
//去掉哪一个注解的默认值,就只用给那一个注解的默认值赋值就可以了,注解没有顺序
//注解可以显示赋值,如果没有默认值,我们就必须给注解赋值
@Myannotation1
public void test01(){
System.out.println("自定义注解1");
}
@Myannotation2("joseph")
public void test02(){
System.out.println("自定义注解2");
}
}
//定义一个注解,一般只要@Target和@Retention
@Target(value={ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(value= RetentionPolicy.RUNTIME)
@Documented
@Inherited
@interface Myannotation1{
//注解的参数:参数类型 + 参数名();
//加了default之后,@MyAnnotation()就可以不在里面加参数 也可以赋值
String name() default "";
int age() default 0;
int id() default -1; //如果默认值为-1,代表不存在;与indexof类似,如果找不到就返回-1;
String[] scholls() default {"qinghua","peking"};
}
//定义一个注解,一般只要@Target和@Retention
@Target(value={ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(value= RetentionPolicy.RUNTIME)
@Documented
@Inherited
@interface Myannotation2{
//如果只有一个参数,则名字使用value;在使用注解时,名字可省略
String value();
}