反射Class对象功能Field、Constructor、Method

 

 获取成员变量们代码演示:

package cn.chunzhi.reflect;

import cn.chunzhi.domain.Person;

import java.lang.reflect.Field;

public class Test02ReflectField {
    public static void main(String[] args) throws Exception {
        // 1.获取Person的Class对象
        Class<Person> personClass = Person.class;
        /*
            获取成员变量们:
                Field[] getFields()
                Field getField(String name)

                Field[] getDeclaredFields()
                Field getDeclaredFields(String name)
         */
        // Field[] getFields():获取所有public修饰的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        // Field getField(String name):获取指定名称的public修饰的成员变量
        System.out.println("===============================");
        Field a = personClass.getField("a");

        // 获取成员变量a的值
        Person p = new Person();
        Object value = a.get(p);
        System.out.println(value);
        // 设置a的值
        a.set(p, "迪丽热巴");
        System.out.println(p);

        System.out.println("===============================");
        // Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        // Field getDeclaredFields(String name)d
        Field d = personClass.getDeclaredField("d");
        // 忽略访问权限修饰符的安全检查
        d.setAccessible(true); // 暴力反射
        Object value02 = d.get(p);
        System.out.println(value02);
    }
}

 

 获取构造方法们代码演示:

package cn.chunzhi.reflect;

import cn.chunzhi.domain.Person;

import java.lang.reflect.Constructor;

public class Test03ReflectConstructor {
    public static void main(String[] args) throws Exception {
        // 1.获取Person的Class对象
        Class<Person> personClass = Person.class;
        /*
            获取构造方法们:
                Constructor<?>[] getConstructors()
                Constructor<T> getConstructor(类<?>... parameterTypes)

                Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
                Constructor<?>[] getDeclaredConstructor()
         */
        // Constructor<T> getConstructor(类<?>... parameterTypes)
        // 构造器就是用来创建对象的他的方法就是newInstance,这个方法中的...意思是传递可变参
        Constructor<Person> constructor = personClass.getConstructor(String.class, int.class);
        System.out.println(constructor);
        // 创建对象
        Person p = constructor.newInstance("古力娜扎", 23);
        System.out.println(p); // Person{name='古力娜扎', age=23, a='null', b='null', c='null', d='null'}

        // 空参构造
        Constructor<Person> constructor02 = personClass.getConstructor();
        Person p02 = constructor02.newInstance();
        System.out.println(p02);

        // 空参构造可以简化
        Person p03 = personClass.newInstance(); // newInstance在JDK 9已经被getDeclaredConstructor()代替
        System.out.println(p03);
    }
}

 

 获取成员方法们、方法对象、获取类名代码演示:

package cn.chunzhi.reflect;

import cn.chunzhi.domain.Person;

import java.lang.reflect.Method;

public class Test04ReflectMethod {
    public static void main(String[] args) throws Exception{
        // 1.获取Person的Class对象
        Class<Person> personClass = Person.class;
        /*
            获取成员方法们:
                Method[] getMethod()
                Method getMethod(String name, 类<?>... parameterTypes)

                Method[] getDeclaredMethods()
                Method getDeclaredMethod(String name, 类<?>... parameterTypes)
         */
        // 获取指定名称的方法,空参
        Method eat_method = personClass.getMethod("eat");
        Person p = new Person();
        // 执行方法
        eat_method.invoke(p);

        // 获取指定名称的方法,有参
        Method eat_method02 = personClass.getMethod("eat", String.class);
        // 执行方法
        eat_method02.invoke(p, "饭");

        // 获取所有public修饰的方法
        System.out.println("============================");
        Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            /*
                method:方法对象
                    执行方法:
                        Object invoke(Object obj, Object... args)
                    获取方法名称:
                        String getName:获取方法名
             */
            // 获取方法名
            String name = declaredMethod.getName();
            System.out.println(declaredMethod + ":方法名" + name);
        }

        // 获取类名
        String name = personClass.getName();
        System.out.println(name);
    }
}

 

posted @ 2020-12-06 16:27  春志  阅读(135)  评论(0编辑  收藏  举报