反射获取构造方法ReflectCall
2019-10-08 本文已影响0人
勇者与王者
package Day32_Reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* @Author quzheng
* @Date 2019/10/7 21:34
* @Version 1.0
*
* 获取Class文件对象
* 反射来调用类的方法和成员
*
* 反射获取构造方法并运行,有快捷的方式:
* 前提是:被反射的类,必须有 公有的空参 构造方法
*
* 反射获取 私有构造方法
* 不推荐,破坏封装性和安全性
*
*/
public class ReflectCall {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class c = Class.forName("Day32_Reflection.Person");
//使用class文件
// getConstructors() 获取class文件对象中的所有公共构造器
// Constructor[] cons = c.getConstructors();
// for(Constructor con : cons){
// System.out.println(con);
// }
// 获取指定的构造方法
Constructor con1 = c.getConstructor();
System.out.println(con1);
//运行 获取到的空参数构造方法 newInstance()
Object o = con1.newInstance();
System.out.println(o); //生成的是Person类的实例
// 获取有参数的构造方法
// Constructor<T> getConstructor(Class<?>...parameterTypes)
Constructor con2 = c.getConstructor(String.class,int.class);
System.out.println(con2);
//传递实际参数
Object o1 = con2.newInstance("张三",20);
System.out.println(o1);
// Class类中定义了方法 T newInstance() 直接创建被反射的类的对象实例
// 已经不建议使用了好像
Object o2 = c.newInstance();
System.out.println(o2);
// getDeclaredConstructors() 获取所有 包括私有的构造器
Constructor[] cons1 = c.getDeclaredConstructors();
for(Constructor con : cons1){
System.out.println(con);
}
// 只获取 私有构造器 Constructor getDeclaredConstructor(Class...c)
Constructor con3 = c.getDeclaredConstructor(int.class,String.class);
System.out.println(con3);
// 试图访问私有构造器,会抛出 非法访问异常
Object o3 = con3.newInstance(18,"lisi");
// 此时可以使用 Constructor的父类 AccessibleObject的方法
// setAccessible(boolean b)
// 参数为true 则 指示 反射的对象在使用时,取消 访问检查
con3.setAccessible(true);
Object o33 = con3.newInstance(18,"lisi");
System.out.println(o3);
}
}