Java注解和反射

58 阅读1分钟

注解和反射

1、注解Annotation

1.1、@Document注解

详细可以查看这篇博客:@Document元注解的使用 - 春晨 - 博客园 (cnblogs.com)

作者的简单解释为:在类上面加了@Document注解,在使用JavaDoc命令生成说明文档时,相关注解内容也会加载进去,否则不会加载进去。

1.2、@Target注解

枚举变量类型
ElementType.TYPE针对类、接口
ElementType.FILED针对字段、成员变量
ElementType.METHOD针对方法
ElementType.PARAMETER针对方法参数
ElementType.PACKAGE针对包
ElementType.ANNOTATION_TYPE针对注解

1.3、Retention指定注解的保留域

RetentionPolicy

类型说明
RetentionPolicy.SOURCE源代码级别,由编译器处理,处理之后就不再保留
RetentionPolicy.CLASS注解信息保留到类对应的class文件中
RetentionPolicy.RUNTIME由JVM读取,运行时使用

1.4、代码展示:

InitMethod方法注解

import java.lang.annotation.*;

//@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InitMethod {
}

InitDemo类

public class InitDemo {

     @InitMethod
     public void func(){
            System.out.println("func....");
    }

    @InitMethod
    public void test01(){
        System.out.println("test....");
    }

}

测试类

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestMain {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class<?> cls = Class.forName("com.bubaiwantong.bilibili.InitDemo");
        Method[] methods = cls.getMethods();
        for (Method method : methods) {
            boolean isAnnotation = method.isAnnotationPresent(InitMethod.class);
            System.out.println(method.getName() + " :"  +isAnnotation);
            if(isAnnotation){
                method.invoke(cls.getConstructor(null).newInstance(null), null);
            }
        }

    }
}

2、反射

2.1、Class类

student类

public class Student {
    private String name;

}

测试类

public class TestClass {
    public static void main(String[] args) throws ClassNotFoundException {

        // 通过静态属性 类.class获得
        Class cls1 = Student.class;
        System.out.println(cls1.hashCode());

        // 通过对象获得Class对象
        Student student = new Student();
        Class cls2 = student.getClass();
        System.out.println(cls2.hashCode());

        // 通过包名获得Class对象
        Class<?> cls3 = Class.forName("com.bubaiwantong.reflection.Student");
        System.out.println(cls3.hashCode());

    }
}

image-20220401195412796

image-20220401201508974