黑马程序员技术交流社区

标题: 【广州校区】反射初谈 [打印本页]

作者: 天蓬    时间: 2018-1-24 15:53
标题: 【广州校区】反射初谈
反射就是在程序运行过程中,通过.class文件动态的获取类的信息(属性,构造,方法),并调用
作用:
开发IDE(集成开发环境)
框架开发或框架学习(Struts,Spring,Hibernate) SSH三大框架
反射主要的组成:class,Constructor,Field,Method;
class代表的类对象,(最先使用后面三个才可以用)
Constructor-类的构造器对象,
Field-类的属性对象,
Method-类的方法对象
(反射的第一步而且还是必须的一步)获取类Class对象
Class.forName("类全名");
对象名.getClass();
类名.class
推荐使用:Class.forName("类全名");因为可以避免出现同名而弄错的情况
反射之获取public构造方法并创建对象
Class类获取public构造方法的方法
        * public Constructor<?>[] getConstructors()
                * 获取所有的`public`修饰的构造方法以数组的形式返回。
                * Constructor 用来描述构造方法的类。
        * public Constructor<T> getConstructor(Class<?>... parameterTypes)
                * 获取指定参数的`public`构造方法。
                * 不传参数得到的就是无参构造方法。
`Constructor`类创建对象方法
        * `public T newInstance(Object... initargs) `
                * 指定参数创建对象,没有参加表示使用无参构造方法创建。
* 获取步骤
        * 获得Class对象。
        * 获得指定的公共的构造方法。
        * 通过构造方法类Constructor中的方法newInstance创建对象。

反射之获取private构造方法并创建对象
Class获得私有构造方法的方法
        * public Constructor<?>[] getDeclaredConstructors()
                * 获取所有的构造方法(包含私有的)以数组的形式返回。
        *public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
                * 获取指定参数类型所对应的构造方法(包含私有的)。       
* 调用私有构造方法
         * public void `setAccessible`(boolean flag)
                * 将此对象的accessible设置为true表示取消运行时期的权限检查。
        * public T newInstance(Object... initargs)
                * 指定参数创建对象。
       
* 获取步骤
        * 获得Class对象。
        * 获得指定的私有构造方法。
        * 暴力访问, 通过setAccessible(boolean flag)方法(如果没有写这个方法就会出现图一的情况)
        * 通过构造方法类Constructor中的方法newInstance创建对象。
图一:告诉你这个方法是私有的不能随便获取
正确完整情况:
一般都不推荐暴力反射得到私有构造方法的,因为这样会破坏了程序的封装性,安全性。
        现在看反射好像没什么用,而且获取创建对象很麻烦,但是在后期的作用是很有用的,尤其想在java走的更远,这期只讲class代表的类对象,Constructor-类的构造器对象,下期我们再讲如何反射得到类里面的属性与方法






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2