一篇文章带你读懂反射(四)

88 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的9天,点击查看活动详情

四.反射获取类的结构信息

1.第一组:java.lang.Class类

1.getName:获取全类名

2.getSimpleName:获取简单类名

3.getFields:获取所有publicf修饰的属性,包含本类以及父类的

4.getDeclaredFields:获取本类中所有属性

5.getMethods:获取所有public修饰的方法,包含本类以及父类的

6.getDeclaredMethods:获取本类中所有方法

7.getConstructors:获取所有public修饰的构造器,包含本类

8.getDeclaredConstructors:获取本类中所有构造器

9.getPackage:以Package]形式返回包信息

10.getSuperClass:以Class形式返回父类信息

11.getInterfaces:以Class[]形式返回接口信息

12.getAnnotations:以Annotation[]形式返回注解信息

/**
 * @author LeeZhi
 * @version 1.0
 * 演示如何通过反射获取类的结构信息
 */
public class ReflectionUtils {
    public static void main(String[] args) {
​
    }
    //第一组方法API
    @Test
    public void api_01() throws ClassNotFoundException {
        /**
         * 1.getName:获取全类名
         * 2.getSimpleName:获取简单类名
         * 3.getFields:获取所有publicf修饰的属性,包含本类以及父类的
         * 4.getDeclaredFields:获取本类中所有属性
         * 5.getMethods:获取所有public修饰的方法,包含本类以及父类的
         * 6.getDeclaredMethods:获取本类中所有方法
         * 7.getConstructors:获取本类所有public修饰的构造器
         * 8.getDeclaredConstructors:获取本类中所有构造器
         * 9.getPackage:以Package]形式返回包信息
         * 10.getSuperClass:以Class形式返回父类信息
         * 11.getInterfaces:以Class[]形式返回接口信息
         * 12.getAnnotations:以Annotation[]形式返回注解信息
         */
        //1.得到Class对象
        Class<?> personCls = Class.forName("com.gbx.reflection.Person");
        System.out.println(personCls.getName());
        System.out.println(personCls.getSimpleName());
        Field[] fields = personCls.getFields();
        for (Field field : fields) {
            System.out.println("本类以及父类的属性:" + field.getName());
        }
        Field[] declaredFields = personCls.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println("本类所有属性:"+declaredField.getName());
        }
        Method[] methods = personCls.getMethods();
        for (Method method : methods) {
            System.out.println("本类及父类的方法:" + method.getName());
        }
        Method[] declaredMethods = personCls.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println("本类所有方法:" + declaredMethod.getName());
        }
        Constructor<?>[] constructors = personCls.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println("本类的构造器:" + constructor.getName());
        }
        Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println("本类中所有构造器:" + declaredConstructor.getName());
        }
        System.out.println(personCls.getPackage());
        Class<?> superclass = personCls.getSuperclass();
        System.out.println("父类的class对象"+superclass);
        Class<?>[] interfaces = personCls.getInterfaces();
        for (Class<?> anInterface : interfaces) {
            System.out.println("接口信息:" + anInterface);
        }
        Annotation[] annotations = personCls.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println("注解信息:" + annotation);
        }
    }
}
class A{
    public String hobby;
    public void hi(){
    }
​
    public A() {
    }
}
interface IA{
​
}
interface IB{
​
}
class Person extends A implements IA,IB{
    //属性
    public String name;
    protected int age;
    String job;
    private double sal;
​
    public Person() {
    }
​
    public Person(String name) {
        this.name = name;
    }
​
    private Person(String name,int age){
​
    }
    //方法
    public void m1(){
​
    }
    protected void m2(){
​
    }
    void m3(){
​
    }
    private void m4(){
​
    }
}

2.第二组:java.lang.reflect.Field类

1.getModifiers:以int形式返回修饰符 [说明:默认修饰符是0,public是1,private是2,protected是4,static是8,final是16] public(1)+static (8)=9

2.getType:以Class形式返回类型 3.getName:返回属性名

    @Test
    public void api_02() throws ClassNotFoundException {
        //1.得到Class对象
        Class<?> personCls = Class.forName("com.gbx.reflection.Person");
        Field[] declaredFields = personCls.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println("本类所有属性:"+declaredField.getName()
                    +"该属性的修饰值:"+declaredField.getModifiers()
                    +"该属性的类型"+declaredField.getType());
        }
    }

3.第三组:java.lang.reflect.Method类

1.getModifiers:以int形式返回修饰符 [说明:默认修饰符是0,public是1,private是2,protected是4,static是8,final是16]

2.getReturnType:以Classj形式获取返回类型

3.getName:返回方法名

4.getParameterTypes:以Class[]返回参数类型数组

        Method[] declaredMethods = personCls.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println("本类所有方法:" + declaredMethod.getName()
            +"该方法的访问修饰符"+declaredMethod.getModifiers()
            +"该方法返回类型"+declaredMethod.getReturnType());
            
            //输出当前这个方法的形参数组情况
            Class<?>[] parameterTypes = declaredMethod.getParameterTypes();
            for (Class<?> parameterType : parameterTypes) {
                System.out.println("该方法形参类型:" + parameterType);
            }
        }

4.第四组:java.lang.reflect.Constructor类

1.getModifiers:以int形式返回修饰符

2.getName:返回构造器名(全类名)

3.getParameterTypes:以Class[]返回参数类型数组

 Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println("本类中所有构造器:" + declaredConstructor.getName());
            Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();
            for (Class<?> parameterType : parameterTypes) {
                System.out.println("该构造器的形参类型:" + parameterType);
            }
        }