Java注解开发的使用
作者:互联网
目录
注解
定义:
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性。与类、接口、枚举、是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
- 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
- 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
- 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
1. JDK预定义的注解
@Override
@Deprecated:注释的内容已过时
@SuppressWarnings:压制警告
2. 自定义注解
格式:
// 元注解
public @interface 注解名称 {
// 属性列表
}
自定义注解反编译后的内容
public interface MyAnno extends java.lang.annotation.Annotation {
}
本质就是一个继承了Annotation接口的一个接口。既然是一个接口,我们就可以用接口的方式去开发,可以定义抽象方法等。
public @interface MyAnno {
public String name = "Elian";
public String show();
}
3. 属性
在接口中定义的方法就是它的属性;
- 必须得有返回结果
- 返回的必须是以下类型:
- 基本数据类型
- String类型
- 枚举类型
- 注解
- 及以上的数组类型
public @interface MyAnno {
String name();
String addr();
int age() default 18; // 在使用注解的时候,没有给该属性赋值,那么就使用默认值
PersonEnum person();
}
public @interface MyAnnoNew {
String value();
MyAnno anotherAnno();
String[] names();
}
public enum PersonEnum {
ZhangSan, LiSi
}
public class AnnoTest {
@MyAnno(name = "Elian", addr = "北京通州", person = PersonEnum.LiSi)
public void show() {
}
@MyAnnoNew(names = "Elian",value = "Elian", anotherAnno = @MyAnno(name = "Elian", addr = "北京通州", person = PersonEnum.ZhangSan))
public void value() {
}
}
属性值赋值的注意点:
- 如果定义属性时,使用default关键字给属性默认初始值,可以在使用注解时不赋值,如上age()
- 如果只有一个属性需要赋值,而且该属性的名称是value那么在赋值时,可以省略"value = "
- 数组赋值的时候,值使用{}包裹,如果数组中只有一个值,那么{}可以省略
4. 元注解
JDK中提供的4个元注解
- @Target:描述当前注解能够作用的位置
- ElementType.TYPE:可以作用在类上
- ElementType.METHOD:可以作用在方法上
- ElementType.FIELD:可以作用在成员变量上
- @Retention:描述注解被保留到的阶段
- SOURCE < CLASS < RUNTIME
- SOURCE:表示当前注解只在代码阶段有效
- CLASS:表示该注解会被保留到字节码阶段
- RUNTIME:表示该注解会被保留到运行阶段JVM
- 自定义的注解:RetentionPolicy.RUNTIME 常用,保留到运行时
- @Documented:描述注解是否被抽取到JavaDocAPI中
- @Inherited: 描述注解是否可以被子类继承
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnoSource {
}
5. 注解开发
demo
public class Student {
public void show() {
System.out.println("Student show......");
}
}
class Teacher {
public void show() {
System.out.println("Teacher show......");
}
}
@InvokAnno(className = "com.elian.annotation.Student", methodName = "show")
class MyMain {
public static void main(String[] args) throws Exception {
Class<MyMain> clazz = MyMain.class;
InvokAnno annotation = clazz.getAnnotation(InvokAnno.class);
String className = annotation.className();
String methodName = annotation.methodName();
Class<?> clazzTarget = Class.forName(className);
Object object = clazzTarget.newInstance();
Method method = clazzTarget.getDeclaredMethod(methodName);
method.invoke(object);
}
}
标签:Java,String,show,MyAnno,开发,注解,public,属性 来源: https://www.cnblogs.com/coderElian/p/15948401.html