APP下载

一篇文章了解Java反射和应用

消息来源:baojiabao.com 作者: 发布时间:2026-05-20

报价宝综合消息一篇文章了解Java反射和应用

什么是反射反射就是指程式在执行的时候可以知道一个类的自身资讯。

对于任何一个:可以知道这个类的属性和方法。

对于任何一个物件:可以呼叫这个物件的任何一个方法和属性。

反射就是把java类中的各种成分对映成一个个的Java物件

例如:一个类有:成员变数、方法、构造方法、包等等资讯,利用反射技术可以对一个类进行 解剖,把个个 组成部分对映成一个个物件。

(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)

反射的功能在执行时判断任意一个物件所属的类在执行的时候构造任意一个类的物件在执行时判断一个类所具有的成员变数和方法在执行时呼叫任何一个物件的方法生成动态代理(会有一篇关于动态代理的文章,在这里挖坑)

反射的优点和缺点动态编译和静态编译反射用到的是动态编译,既然有动态编译,就会有静态编译

那么动态编译和静态编译又有什么区别?

静态编译:在编译的时候进确定型别,如果系结物件成功,new 是静态载入类,就编译通过。

1 程式码示例

2 解释

当在Phone.java里面写好程式码的时候,如果需要新增新的类,则需要直接在档案里面修改程式码。假如需要新增一个华为手机,则我需要在Phone.java档案里面加个if语句判断传进来的引数是不是"huawei",这样增加了类之间的耦合性。

当删除一个类的时候Phone.java编译可能会出现错误。 假如我删除了小米手机这个类,phone.java档案没有删除if判断语句,那么phone.java在编译的时候则会失败。

没删除Xiaomi.java编译的时候是成功并且成功执行

删除Xiaomi.java编译的时候就会失败了,因为Xiaomi.java不存在动态编译:在执行的时候确定型别,系结物件。最大发挥了Java的多型,降低类之间的耦合性。

1 程式码示例

Phone.java

2 解释

(1)对比静态编译,当我们需要往Phone.java里面传递新的类引数的时候,根本不需要修改Phone.java的程式码,因为这里应用了Java的多型。只要新建一个新的类实现了PhoneInterface的界面,把类名传进去就可以呼叫。这里体现了 需要哪个类的物件就动态的建立哪个类的物件,也就是说动态的实现了类的载入。

(2)当删除一个类的时候,Phone.java档案不会编译失败。

比如说删除OnePlus.java

区别:这里说明了动态载入的在不修改Phone.java的前提下不会因为其它类的不存在而导致整个档案不能编译,而静态载入则会编译的时候系结物件,从而导致编译失败。

优点以实现动态建立物件和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程式编译后,释出了,当发现需要更新某些功能时,我们不可能要使用者把以前的解除安装,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程式重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用解除安装,只需要在执行时才动态的建立和编译,就可以实现该功能。缺点对效能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。Class类和类型别Class类所有的类是java.lang.Class类的物件,Class类是所有类的类,反射的基础。

Class物件(类型别)普通类构造物件是:Student s = new Student;

但Class物件则不是,看Class类的源代码,构造器是私有的,则使用者无法直接像普通类那样new一个Class的物件,只有JVM才可以构造Class物件。

但是我们可以通过一个已知的类获得Class物件

有以下三种方式:

Class物件就是类型别,在这里表示的是Student类的型别,下面看一个图了解Class物件是什么和类在JVM中载入的过程由图中可以看出,一个具体的Class物件就储存了具体类的基本属性和方法,并且可以呼叫。

Student类反射相关操作文章开始说过,反射会把一个类的成分(成员变数,方法,构造器)各自对映成一个个物件(Field物件,Method物件,Construct物件),

一个类中这些成员方法、构造方法、在加入类中都有一个类来描述。

java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;

通过Class物件我们可以做什么呢?

获取成员方法Method获取成员变数Field获取建构函式Construct获取成员方法用法

例子结果只要知道包的限定名,就可以对Student这个类进行所有操作

获取成员变数资讯成员变数 = 成员型别+变数名

用法

获取成员变数,通过Class类的以下方法,变数是 成员变数名

例子获取建构函式资讯获取建构函式,Class的方法如下

用法

例子

Student类的私有建构函式

获取私有的建构函式,并且设定为public从而可以建立物件结果实现对数据库增,查。原理储存资料时:把pojo类的属性取出来,拼凑sql语句查询资料的时:把查询到的资料包装成一个Java物件一张资料表对应java的一个pojo物件,表中的每一个字段(column)对应pojo的每一个属性资料表名和Pojo的类名相等,column和pojo的属性相等,不区分大小写(数据库中不区分大小写)pojo的每一个属性的get和set方法,都是为了后续的操作例项资料表Userpojo User类数据库连线的工厂类操作数据库的dao结果总结Java反射非常好用,灵活性非常大,不用花费太多的时间去写操作数据库的程式码,让重点在开发者的业务逻辑上。现在很多和数据库操作的框架都用到反射,只要配置档案,按照框架的规则就可以对数据库进行相对应的操作了。

2019-12-28 15:53:00

相关文章