首页技术文章正文

【成都校区*文章*反射机制】【黑马java培训】

更新时间:2019年07月26日 10时45分51秒 来源:黑马程序员论坛

一:
反射技术:动态的获取指定的类以及动态的调用类中的内容
动态:类不确定
其实就是,在你还没有创建这个类的时候就用这个类创建对象,使用方法,这能大大的提高程序的扩展性。
应用场景:在一个完全写好的程序中你要再扩展功能,用之前的知识,肯定是,源程序留一个接口,在外部创建一个类实现接口,并且,在程序中创建实现类的对象调用方法,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");


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


推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!