Java里面反射的原理是什么?

Python015

Java里面反射的原理是什么?,第1张

Java在编译之后会生成一个class文件,反射通过字节码文件找到其类中的方法和属性等。

通过反射,java可以动态的加载未知的外部配置对象,临时生成字节码进行加载使用,使代码更灵活,极大地提高应用的扩展性。

其实博客会有更加详细的解释。

Java反射机制是一个非常强大的功能,在很多大型项目比如Spring,Mybatis都可以看见反射的身影。

通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。

下面java课程http://www.kmbdqn.cn/就从实际应用的角度出发,来应用一下Java的反射机制。

反射基础p.s:本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的QuickStart。

在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。

通过getClass方法在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类:Strings="ziwenxie"Class<?>c=s.getClass()通过forName方法我们也可以调用Class类的静态方法forName:Class<?>c=Class.forName("java.lang.String")使用.class或者我们也可以直接使用.class:Class<?>c=String.class获取类型信息在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。

首先我们在typeinfo.interfacea包下面新建一个接口A:packagetypeinfo.interfaceapublicinterfaceA{voidf()}接着我们在typeinfo.packageaccess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。

理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助。

一、Class类的使用1、万事万物皆对象,(当然,基本数据类型,静态成员不是面向对象(属于类的)),所以我们创建的每一个类也都是对象,即类本身是java.lang.Class类的实例对象,但是这些对象都不需要new出来,因为java.lang.Class类的构造方法是私有的2、任何一个类都是Class类的实例对象,这个实例对象有三种表示方式:(我们新建一个Student类)(上海尚学堂java全程老师面授+实战教学)①Classc1=Student.class//实际告诉我们任何一个类都有一个隐含的静态成员变量class(知道类名时用)②Classc2=stu.getClass()//已知该类的对象通过getClass方法(知道对象时用)③Classc3=Class.forName("类的全名")//会有一个ClassNotFoundException异常官网解释说:c1,c2表示了Student类的类类型()classtype),万事万物皆对象,类也是对象,是Class类的实例对象,这个对象我们成为该类的类类型(有点乱,但是慢慢捋一下还是能理解的)这里有一点值得注意,当我们执行System.out.println(c1==c2)语句,结果返回的是true,这是为什么呢?原因是不管c1还是c2都代表了Student类的类类型,一个类可能是Class类的一个实例对象。

我们完全可以通过类的类类型创建该类的对象实例,即通过c1或c2创建Student的实例。

Studentstu=(Student)c1.newInstance()//前提是必须要有无参的构造方法,因为该语句会去调用其无参构造方法。

该语句会抛出异常。

二、动态加载类1、编译时加载类是静态加载类,new创建对象是静态加载类,在编译时刻就需要加载所有可用使用到的类,如果有一个用不了,那么整个文件都无法通过编译2、运行时加载类是动态加载类Classc= Class.forName("类的全名"),不仅表示了类的类型,还表示了动态加载类,编译不会报错,在运行时才会加载,使用接口标准能更方便动态加载类的实现。

功能性的类尽量使用动态加载,而不用静态加载。

辽宁电脑培训http://www.kmbdqn.cn/发现很多软件比如QQ,360的在线升级,并不需要重新编译文件,只是动态的加载新的东西。