【JAVA基础】- 反射

2019-05-18  本文已影响0人  lconcise

反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法.

获取class文件对象(三种方法)

        // 获取class文件对象
        // 第一种 数据类型的静态属性class
        Class<Person> personClass = Person.class;

        // 第二种 Object类的getClass()方法
        Person person = new Person();
        Class<? extends Person> personClass2 = person.getClass();
        // 第三种 Class类中的静态方法
        Class<?> personClass3 = Class.forName("top.lconcise.demo.Person");

通过反射获取构造方法并使用

    public static void main(String[] args) throws Exception {
        // 获取字节码文件对象
        Class<?> personClass = Class.forName("top.lconcise.demo.Person");
        // 获取公有的无参构造方法
        Constructor<?> constructor = personClass.getConstructor();

        Object person = constructor.newInstance();
        System.out.println(person);
        // 获取私有的有参构造方法
        Constructor<?> declaredConstructor = personClass.getDeclaredConstructor(String.class);
        // 暴力访问
        declaredConstructor.setAccessible(true);
        Object person2 = declaredConstructor.newInstance("张小龙");
        System.out.println(person2);
    }

通过反射获取成员变量并为其赋值

    public static void main(String[] args) throws Exception {
        // 获取字节码文件对象
        Class<?> personClass = Class.forName("top.lconcise.demo.Person");
        // 获取无参构造方法
        Constructor<?> constructor = personClass.getConstructor();
        // 创建对象
        Object person = constructor.newInstance();
        // 获取成员变量并赋值
        Field usernameField = personClass.getDeclaredField("username");
        usernameField.setAccessible(true);
        usernameField.set(person, "张小龙");

        System.out.println(person);
    }

获取成员方法,并执行方法

    public static void main(String[] args) throws Exception {
        // 获取字节码文件对象
        Class<?> aClass = Class.forName("top.lconcise.demo.Person");
        // 获取无参构造方法
        Constructor<?> constructor = aClass.getConstructor();
        // 创建一个对象
        Object obj = constructor.newInstance();

        // 获取成员方法,并执行方法
        Method method = aClass.getMethod("method");
        Method method2 = aClass.getMethod("method2", String.class);
        Method method3 = aClass.getDeclaredMethod("method3", String.class);

        method.invoke(obj);
        method2.invoke(obj, "hello");
        method3.setAccessible(true);
        method3.invoke(obj, "hello");
    }

Demo(1)

/**
 * Created by liusj on 2019/5/10
 * <p>
 * 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法.
 *
 * List 集合中添加元素的两种方法
 */
public class ReflectDemo {

    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();

        list.add("hello");
        list.add("world");

        Class<? extends List> aClass = list.getClass();
        Method method = aClass.getMethod("add", Object.class);
        method.invoke(list, "java");

        System.out.println(list);

        // 获取class文件对象
        // 第一种 数据类型的静态属性class
        Class<Person> personClass = Person.class;

        // 第二种 Object类的getClass()方法
        Person person = new Person();
        Class<? extends Person> personClass2 = person.getClass();
        // 第三种 Class类中的静态方法
        Class<?> personClass3 = Class.forName("top.lconcise.demo.Person");


        System.out.println(personClass == personClass2);
        System.out.println(personClass2 == personClass3);
    }
}

Demo(2)

/**
 * Created by liusj on 2019/5/13
 * <p>
 * 通过反射给对象的成员变量赋值.
 */
public class ReflectTool {

    public void setProperty(Object obj, String propertyName, Object value)
            throws NoSuchFieldException, IllegalAccessException {
        // 根据对象获取字节码文件对象
        Class<?> aClass = obj.getClass();
        // 获取对象的propertyName成员变量
        Field declaredField = aClass.getDeclaredField(propertyName);
        // 取消访问检查
        declaredField.setAccessible(true);
        // 给对象的成员变量赋值
        declaredField.set(obj, value);
    }
}
上一篇下一篇

猜你喜欢

热点阅读