通过反射动态创建对象执行的方法
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());
}
}
总结:
- 通过Class对象.newInstance()是调用的对象的无参构造,要是该对象没有无参构造,就不能创造对象;
- 通过Class对象先去获取构造方法,再通过构造方法.newInstance(传入对应的参数)可以走有参构造和无参构造;
- 通过反射获取的方法可以通过方法名.invoke(对象,""参数"")的方式来激活使用;
- 通过反射获取的属性,如果private修饰不能直接操作,需要先关闭程序的安全检测name.setAccessible(true).
本文来自博客园,作者:小徐学狂,转载请注明原文链接:https://www.cnblogs.com/xd-study/p/13211938.html