黑马程序员技术交流社区

标题: 【成都校区*文章*反射机制】 [打印本页]

作者: 小蜀哥哥    时间: 2019-7-4 18:45
标题: 【成都校区*文章*反射机制】
一:
反射技术:动态的获取指定的类以及动态的调用类中的内容
动态:类不确定
其实就是,在你还没有创建这个类的时候就用这个类创建对象,使用方法,这能大大的提高程序的扩展性。
应用场景:在一个完全写好的程序中你要再扩展功能,用之前的知识,肯定是,源程序留一个接口,在外部创建一个类实现接口,并且,在程序中创建实现类的对象调用方法,BUT, 你没有源代码,也就是说你无法在源代码中操作,此时就要用到反射,在程序的配置文件中,写好类的名字,在程序中创建类的对象(这是在写程序的时候干的)。这就是在类不确定(甚至不知有木有的情况下)使用类来创建对象。

二:
.class 文件是Java的运行文件,来自于源文件的编译
.class(类文件)中包含了,类的成员变量和方法
字节码文件对应的类:在Java 中有专门描述字节码文件的类Class(描述类文件的类)

[Java] 纯文本查看 复制代码
class Class{//字节码文件对应的类

                Filed  filed ;//字段(类中的成员变量)将字段封装成对象(修饰/名字/值)对象类型Filed

                Constructor cons;//将构造函数也封装成对象(名字,参数列表。。)对象类型 Constructor

                Method method;   

                ////将类中的这些成员都封装成对象,变成Class 类的成员。并且提供了对这些成员的操作

                getFiled();

                getMethod();

                getConstructor();

                //...

}



三:
电脑中 .class 文件(存储的是编译后的相应类的二进制文件)————>Java 中描述.class 二进制文件的类 Class(字节码文件的类)————>Java 中对象的创建依赖的就是.class 二进制文件

如何获取字节码文件的类:程序中的对象是依赖于.class 文件创建的,所以通过对象来获取
1.getClass(); //获取字节码文件的类,但是前提是:有类对应的对象

[Java] 纯文本查看 复制代码
Person person = new Person();

Class class = person.getClass();


2.使用数据类型的静态属性。class

Class class = Person.class;

方式三:通过Class 这个类中提供的方法 forName (通过给定的类名,得到字节码文件对象),自动找对应的字节码文件,加载到内存中

Class p = Class.forName("Reflect.Person");//类的名字要写的完全,包名+类名
        //通过newInstance 方法创建字节码文件对应表示的类的实例
        Object obj = p.newInstance();//不依赖于类,去创建类的实例。但是在这个程序写好后必须要有类,不然运行时会出错
        //这就是反射技术获取类的字节码文件对象的方式

四:常见异常解析:
ClassNotFoundException:找不到类对应的字节码文件
InstantiationException :初始化异常,如果类没有提供空参构造函数,就会出现异常
IllegalAccessException:类提供了空参构造函数,但是权限不够也会报错

五:如何根据指定的带参构造函数创建对象

[Java] 纯文本查看 复制代码
 Constructor con = p.getConstructor(String.class,int.class);

        Object ob = con.newInstance("Lisi",12);//通过构造器来创建对象


六:获取字节码文件对象中的成员
关于获取字节码文件对象的成员:
getXXXX():获取的是共有的getDeclaredXXX():获取的是声明了的

1.获取字段:字节码文件对象.getField() //getDeclaredField()
对于私有的成员变量,是无法对他进行操作的,暴力访问:
field.setAccessible(true);修改权限
修改值: field.set(obj,30);
获取值:field.get(obj)
//
2.获取方法
[Java] 纯文本查看 复制代码

Method method = p.getMethod("show",int.class,String.class);

method.invoke(obj,12,"Wangwu");


七:反射的应用:
反射的使用精华在于,在还没有写类的时候你可以使用类。然后你在封装好的程序外面,在定义类,写好相应的方法。可以完美的解决程序扩充功能这个需求
反射技术的亮点就是为已经写好的程序扩充功能







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