Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。注解是结合反射来运行的,注解相当于一个标识,不做具体的操作,具体操作是由反射来完成的。
Java语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义 Java 标注。
说明:指定注解针对的地方
@Target({ElementType.TYPE})
说明:
ElementType.TYPE:针对类、接口
ElementType.FIELD:针对成员变量
ElementType.METHOD:针对成员方法
ElementType.PARAMETER:针对方法参数
ElementType.CONSTRUCTOR:针对构造器
ElementType.PACKAGE:针对包
说明:指定注解的保留域
@Retention(RetentionPolicy.RUNTIME)
说明:
RetentionPolicy.RUNTIME:由JVM读取,运行时使用
RetentionPolicy.SOURCE:源代码级别,由编译器处理,处理之后就不再保留
RetentionPolicy.CLASS:注解信息保留到类对应的class文件中
说明:分别定义注解方法、注解类、注解属性。
package com.java.master.注解;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface InitClass {
}
package com.java.master.注解;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InitMethod {
}
package com.java.master.注解;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InitValue {
String value();
}
说明:在这个类上分别使用类注解、方法注解、属性注解。
@InitClass
@Getter
@Setter
@ToString
public class InitDemo {
@InitValue("1")
private Integer id;
@InitValue("小白")
private String name;
@InitMethod
public void init() {
System.out.println("我是注解方法");
}
public void start() {
System.out.println("我是普通方法");
}
}
public class AnnotationTest {
public static void main(String[] args) throws Exception{
// 反射获取class对象
Class clazz = Class.forName("com.java.master.注解.InitDemo");
Method[] methods = clazz.getMethods();
for (Method method : methods) {
// 判断方法是否添加注解通过这个判断
boolean isInitMethod = method.isAnnotationPresent(InitMethod.class);
if (isInitMethod) {
method.invoke(clazz.newInstance());
}
}
// 反射获取class对象
Class<InitDemo> aClass = InitDemo.class;
// 判断类是否添加注解通过这个判断
InitClass annotation = aClass.getAnnotation(InitClass.class);
if (null != annotation) {
System.out.println("InitDemo 添加了注解 InitClass");
Constructor<InitDemo> constructor = aClass.getConstructor(null);
InitDemo initDemo = constructor.newInstance(null);
// 判断属性是否添加注解通过这个判断
Field[] fields = aClass.getDeclaredFields();
for (Field field : fields) {
InitValue initValue = field.getAnnotation(InitValue.class);
if (null != initValue) {
System.out.println(field.getName() + "添加了注解并且设置了初始值: " + initValue);
// 暴力反射
field.setAccessible(true);
// 判断属性类型
// System.out.println(field.getType().getName());
if (field.getType().getName().equals("java.lang.Integer")) {
Integer val = Integer.parseInt(initValue.value());
field.set(initDemo, val);
} else {
field.set(initDemo, initValue.value());
}
}
}
System.out.println(initDemo);
} else {
System.out.println("无法创建InitDemo对象");
}
}
}
输出:
我是注解方法
InitDemo 添加了注解 InitClass
id添加了注解并且设置了初始值: @com.java.master.注解.InitValue(value=1)
name添加了注解并且设置了初始值: @com.java.master.注解.InitValue(value=小白)
InitDemo(id=1, name=小白)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。