【Java】Reflection 反射机制 02获取类的一切

先创建一个可演示的类

 

注解类

package cn.dai.Reflection.demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE,ElementType.PACKAGE,ElementType.FIELD,ElementType.METHOD,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAt {
    String value() default "sample";
}

接口

public interface Plug {
    void info();
}

父类

public class Creature<T> implements Serializable {

    private boolean gender;
    private double weight;

    private void breath(){
        System.out.println("生物在呼吸");
    }

    public void eat(){
        System.out.println("生物吃食");
    }
}

本类

@MyAt("Animal")
public class Animal extends Creature<String> implements Comparable<String>,Plug {

    @MyAt("旺财")
    private String name;
    public int id;

    public Animal() {
    }

    public Animal(String name, int id) {
        this.name = name;
        this.id = id;
    }

    @MyAt("雪糕")
    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @MyAt("中国")
    public String show(String nation){
        System.out.println("我来自:"+ nation);
        return nation;
    }


    @Override
    public void info() {
        System.out.println("我是一个动物!!!");
    }

    @Override
    public int compareTo(String o) {
        return 0;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}

 

获取运行时类的所有结构

 

属性获取

    @Test
    public void getInstanceAllField(){
        Class<Animal> animalClass = Animal.class;

        // 获取本类和父类的所有属性,返回一个属性类实例的数组 本类和父类private修饰的字段是不能被获取到的
        Field[] fields = animalClass.getFields();

        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("-----------------------------------------------------------------");

        // getDeclaredFields(); 当前运行时类的所有属性 没有访问权限限制,仅限本类独有的字段
        Field[] declaredFields = animalClass.getDeclaredFields();
        for (Field field : declaredFields) {
            System.out.println(field);
        }
    }

    @Test
    public void getInstance2(){
        Class<Animal> animalClass = Animal.class;
        
        Field[] declaredFields = animalClass.getDeclaredFields();
        for (Field field : declaredFields) {
            // 权限修饰访问
            int modifiers = field.getModifiers();//获取访问权限修饰 返回的是一个权限状态值
            String accessModifier = Modifier.toString(modifiers); // 通过这个权限修饰类转换一下

            // 数据类型访问 获取
            Class<?> fieldType = field.getType();
            String fieldTypeName = fieldType.getName();

            // 字段标识名 获取
            String fieldName = field.getName();

            System.out.println(accessModifier + " " + fieldTypeName + " " + fieldName);
        }
    }

 

方法的获取

    @Test
    public void getMethods(){
        Class<Animal> animalClass = Animal.class;

        // 获取当前运行时类和及其父类,所有public修饰的方法
        Method[] methods = animalClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        System.out.println("-----------------------------------------------------------------");

        // 获取当前运行时类中声明的所有方法,不包含父类
        Method[] declaredMethods = animalClass.getDeclaredMethods();
        for (Method method:declaredMethods) {
            System.out.println(method);
        }
    }

    @Test
    public void getFactor(){
        // 权限修饰,返回类型,方法名,参数,抛出的异常,注解,注解的值
        Class<Animal> animalClass = Animal.class;
        // 获取声明的注解
        Method[] declaredMethods = animalClass.getDeclaredMethods();
        for (Method method:declaredMethods) {

            Annotation[] annotations = method.getAnnotations();
            for (Annotation annotation: annotations) {

                System.out.println(annotation); // @cn.dai.Reflection.demo.MyAt(value=中国)
            }

            // 获取方法的权限修饰
            int modifiers = method.getModifiers();
            String accessModifier = Modifier.toString(modifiers);

            // 获取返回类型
            Class<?> returnType = method.getReturnType();
            String returnTypeName = returnType.getName();

            // 获取方法名
            String methodName = method.getName();

            // 获取参数
            Class<?>[] parameterTypes = method.getParameterTypes();
            if (!(parameterTypes == null && parameterTypes.length == 0)){

                for (int i = 0; i < parameterTypes.length; i++) {
                    System.out.println(parameterTypes[i].getName() + "参数" + i);
                }
            }

            // 异常的获取
            Class<?>[] exceptionTypes = method.getExceptionTypes();
            if (exceptionTypes.length > 0){
                for (int i = 0; i < exceptionTypes.length; i++) {
                    System.out.println( exceptionTypes[i].getName() );
                }
            }
        }
    }

 

构造器获取

    @Test
    public void constructor(){
        Class<Animal> animalClass = Animal.class;

        // 当前运行时类中声明为Public 的构造器
        Constructor[] constructors = animalClass.getConstructors();
        for (Constructor constructor:constructors) {
            System.out.println(constructor);
        }

        System.out.println("--------------------------------------");

        // 当前运行时类自己的构造器,无论权限修饰
        Constructor[] declaredConstructors = animalClass.getDeclaredConstructors();
        for (Constructor constructor: declaredConstructors) {
            System.out.println(constructor);
        }
    }

 

父类获取,及泛型获取

    @Test
    public void superClass(){
        Class<Animal> animalClass = Animal.class;

        // 仅父类
        Class<? super Animal> superclass = animalClass.getSuperclass();
        System.out.println(superclass);

        // 带泛型的父类
        Type genericSuperclass = animalClass.getGenericSuperclass();
        System.out.println(genericSuperclass);

        ParameterizedType type = (ParameterizedType)genericSuperclass;

        // 多个泛型参数类
        Type[] actualTypeArguments = type.getActualTypeArguments();
        // 取第一个泛型参数类的名字
        System.out.println(((Class)actualTypeArguments[0]).getName());
    }

 

接口,所在包,注解

    @Test
    public void IPA(){
        Class<Animal> animalClass = Animal.class;

        // 接口是多实现的,所有可能有多个存在
        Class<?>[] interfaces = animalClass.getInterfaces();

        for (Class interFace:interfaces) {
            System.out.println(interFace);
        }

        System.out.println("---------------------------------------");

        // 获取父类接口
        Class<?>[] interfaces1 = animalClass.getSuperclass().getInterfaces();

        for (Class interFace:interfaces1) {
            System.out.println(interFace);
        }

        System.out.println("----------------------------------------");

        // 所在包
        Package aPackage = animalClass.getPackage();
        System.out.println(aPackage);

        // 类上的注解
        Annotation[] annotations = animalClass.getAnnotations();
        for (Annotation annotation : annotations){
            System.out.println(annotation);
        }
    }

 

posted @ 2020-04-23 11:16  emdzz  阅读(164)  评论(0编辑  收藏  举报