反射概述
反射是指对于任何一个Class类,在“运行的时候”都可以直接得到这个类全部成分
在运行时,可以直接得到这个类的构造器对象:Constructor
在运行时,可以直接得到这个类的成员变量:Field
在运行时,可以直接得到这个类的成员方法对象:Method
这种运行时动态获取类信息以及动态调用类中成分的能力称为java语言的反射机制
获取Class类的对象的三种方式
方式一:Class c1 = Class.forName("全类名")
方式二:Class c2 = 类名.class
方式三: Class c3 = 对象.geClass();
//1.Class类中的一个静态方法:forName
Class<?> c = Class.forName("com.fanshe.Student");
System.out.println(c); //Student.class
//2.类名.class
Class c1 = Student.class;
System.out.println(c1);
//3.对象.getClass()获取对象对应类的Class对象。
Student s = new Student();
Class c2 = s.getClass();
System.out.println(c2);
获取构造器
方式一:getDeclaredConstructors()
方式二:getDeclaredConstructor(Class<?>.. parameterTtypes)
//1.获取类对象
Class c = Student.class;
//2.提取类中的全部构造器对象,包括私有的
Constructor[] declaredConstructors = c.getDeclaredConstructors();
//3.遍历构造器
for (Constructor declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor.getName()+"======>"+declaredConstructor.getParameterCount());
}
反射得到的构造器可以做什么
创建对象:
-
public newInstance(Object... initargs)
如果是非public的构造器,需要打开权限(暴力反射),然后在创建对象:
-
setAccessible(boolean)
-
反射可以破坏封装性,私有的也可以执行了
//1.获取类对象
Class c = Student.class;
//2.定位单个构造器对象(按照参数定位无参数构造器)
Constructor cons= c.getDeclaredConstructor();
System.out.println(cons.getName()+"====>"+cons.getParameterCount());
//如果遇到私有的构造器,可以暴力放射
cons.setAccessible(true);//权限被打开
Student s = (Student) cons.newInstance();
System.out.println(s);
//3.定位某个有参构造器
Constructor cons1 = c.getDeclaredConstructor(String.class, int.class);
System.out.println(cons1.getName()+"====>"+cons1.getParameterCount());
Student zhansna = (Student) cons1.newInstance("zhansna", 18);
System.out.println(zhansna);
获取方法对象