通过反射动态创建对象执行的方法

2.0、通过反射动态创建对象执行的方法

public class Test09 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得Class对象
        Class c1 = Class.forName("com.xu.reflection.User");

        //构造一个对象
        //User user = (User)c1.newInstance();//本质是调用类的无参构造
        //System.out.println(user);

        //通过构造器创造对象
        //Constructor constructor = c1.getDeclaredConstructor(int.class, String.class, int.class);
        //User user1 = (User) constructor.newInstance(001, "泥人", 18);
        //System.out.println(user1);

        //通过反射调用普通方法
        User user2 = (User)c1.newInstance();
        //通过反射获取一个方法
        Method setName = c1.getDeclaredMethod("setName", String.class);
        //invoke:激活的意思
        //(对象,"方法的值")
        setName.invoke(user2,"泥人");
        System.out.println(user2.getName());
        System.out.println("76777777777777");
        User user3 = (User)c1.newInstance();
        Field name = c1.getDeclaredField("name");

        //不能直接操作私有属性,我们需要关闭程序的安全检测setAccessible(true)
        name.setAccessible(true);
        name.set(user3,"泥人a");
        System.out.println(user3.getName());
    }
}

总结:

  1. 通过Class对象.newInstance()是调用的对象的无参构造,要是该对象没有无参构造,就不能创造对象;
  2. 通过Class对象先去获取构造方法,再通过构造方法.newInstance(传入对应的参数)可以走有参构造和无参构造;
  3. 通过反射获取的方法可以通过方法名.invoke(对象,""参数"")的方式来激活使用;
  4. 通过反射获取的属性,如果private修饰不能直接操作,需要先关闭程序的安全检测name.setAccessible(true).
刚刚参加工作,很有很多不懂不会的,发现错误,欢迎指正,谢谢!
原文地址:https://www.cnblogs.com/xd-study/p/13211938.html