反射概述: 反射是指对于任何一个Class类,在”运行的时候“都可以直接得到这个类全部的成分。 在运行时,可以直接得到这个类的构造器对象:Constructor 在运行时,可以直接得到这个类的成员变量对象:Field 在运行时,可以直接得到这个类的成员方法对象:Method 这种行动时动态获取类信息以及动态调用类中成分的能力成为JAVA语言的反射机制。 反射的关键: 反射的第一步都是先得到编译后的Class类对象,然后就可以得到Class的全部成分。 HelloWorld.java->javac->HelloWorld.class Class c =HelloWorld.class; 反射的基本作用,关键? 反射在运行时获取类的字节码文件对象:然后可以解析类中的全部成分。 反射的核心思想和关键就是:得到编译以后的class文件对象 --------------------------------------------------------------------- 反射第一步:获取Class类的对象 编译 内存 创建对象 java文件————————>Class文件 Class对象—————————————>new Student() (字节码文件) —————————————————————————— 源代码阶段 Class对象阶段 Runtime运行阶段 | | Class类中的静态方法 2.类名.class 3.对象.getClass() | 1.forName(String className) ********************************************************************* 内存 —————————————————————————————————————————————————— | Class对象 Student.class (第一步:获得class对象) | | —————————————————————————————————————————— | | | [private String name; private int age]|——————————>Field | |[空参构造;带参构造] |<———————Constructor(第二部:获得 ................................................Constructor对象)——>(第三步:创建对象) | |[成员方法] |——————————>Method | | | | | |—————————————————————————————————————— | | |———————————————————————————————————————————————— ******************************************************************************* 反射的第一步是? 获取Class类对象,如此才可以解析类的全部成分 获取Class类的对象的三种方式 1:Class c1=Class.forName("全类名") 2:Class c2=类名.class 3:Class c3=对象.getClass() 使用反射技术获取构造器对象并使用 反射的第一步是先得到类对象,然后从类对象中获取类的成分对象 Class类中用于获取构造器的方法 方法 说明 Constructor<?>[]getConstructors() 返回所有构造器对象的数组(只能public) Constructor<?>[]getDeclaredConstructors() 返回所有构造器对象的数组(存在就能拿到) Constructor<T>getConstructor(Class<?>...parameterTypes) 返回单个构造器对象(只能public) Constructor<T>getDeclaredConstructor(Class<?>...parameterTypes) 返回单个构造器对象,存在就能拿到 使用反射技术获取构造器对象并使用 获取构造器的作用依然是初始化一个对象返回 ConStructor类中用于创建对象的方法 符号 说明 T newInstance(Object...initargs) 根据指定的构造器创建对象 public void setAccessibile(boolean flag) 设置为true,表示取消访问检查,进行暴力反射 总结: 1.利用反射技术获取构造器对象的方式 getDeclaredConstructors() getDeclaredConstructor(Class<?>...parameterTypes) 2.反射得到的构造器可以做什么? 依然是创建对象的 public newInstance(Obj..initargs) 如果是非public的构造器,需要打开权限(暴力反射),然后再创建对象 setAccessible(boolean) *!!反射可以破坏封装性,私有的也可以执行
-----------------------------------------------------------------------------------------------------------
@Test public void getConstructors() { //1.getConstructors: //获取全部的构造器,只能获取public修饰的 //Constructor[] getConstructors() //第一步:获取类多项 Class c = Student.class; //第二步:提取类中全部的构造器对象(放到数组里面)(只能拿public) Constructor[] constructors = c.getConstructors(); //第三步:遍历构造器 for (Constructor constru : constructors) { //(参数个数) System.out.println(constru.getName() + "===>" + constru.getParameterCount()); } } //2.getDeclaredConstructors(); //获取全部构造器,只要敢写,全部都能拿到,无所谓权限 @Test public void getDeclaredConstructors() { //第一步:获取类多项 Class c = Student.class; //第二步:提取类中全部的构造器对象(放到数组里面)(全部无所谓权限) Constructor[] constructors = c.getDeclaredConstructors(); //第三步:遍历构造器 for (Constructor constru : constructors) { //(参数个数) System.out.println(constru.getName() + "===>" + constru.getParameterCount()); } } //3.getConstructor(Class..parometerTypes) //获取某个构造器,只能拿public修饰的某个构造器 @Test public void getConstructor() { //第一步:获取类多项 Class c = Student.class; //第二步:定位单个构造对象(定位public无参构造器) Constructor cons = null; try { cons = c.getConstructor(); } catch (NoSuchMethodException e) { e.printStackTrace(); } System.out.println(cons.getName() + "===>" + cons.getParameterCount()); } //4.getDeclaredConstructor //获取某个构造器,只要你敢写,这里要能拿到,无所谓权限 @Test public void getDeclaredConstructor() { //第一步:获取类多项 Class c = Student.class; //第二步:定位全部无参构造对象(无所谓权限) Constructor cons = null; try { cons = c.getDeclaredConstructor(); } catch (NoSuchMethodException e) { e.printStackTrace(); } System.out.println(cons.getName() + "===>" + cons.getParameterCount()); //5.定位某个有参构造 try { cons = c.getDeclaredConstructor(String.class,int.class); } catch (NoSuchMethodException e) { e.printStackTrace(); } System.out.println(cons.getName() + "===>" + cons.getParameterCount()); }