关于java反射的一点问题

时间:2022-01-30 20:21:22
反射动态执行一个对象的方法,这里的动态怎么理解,跟直接调用该对象的方法有什么区别?求解……

7 个解决方案

#1


运行期才知道被反射对象是什么样的,菜鸟理解。

#2


Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象,无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。Java reflection 非常有用,它使类和数据结构能按名称动态检索相关信息,并允许在运行着的程序中操作这些信息。Java 的这一特性非常强大,并且是其它一些常用语言,如 C、C++、Fortran 或者 Pascal 等都不具备的。

但反射有两个缺点。第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。

#3


有点唬人扯淡,不过等你明白了估计会觉得蛮恶心的,原意就是说你要new 一个类,必须要知道类名才可以,一般都是写死的,因为无法在程序中把 A a=new A();这样的静态写法换成可以替换的变量参数,于是java的设计者们就想出了:是否可以把A这个类也描述成对象.就是描述A这个类的类,根据java万物皆对象的思想,很容易理解,jdk中有个方法叫Class.forName("A"),大家看,我们是不是实现了把A作为一个动态的可以替换的变量参数,最终得到的是这个类运行时期的字节码对象,说白了,就是你虽然你没吃过A猪但是总还可以看见A猪跑的,你把这只跑起来的A猪用工具抓起来,既然我们获取了这个类的字节码对象,那当然就很容易对这个类再创造了,就是让A猪给我下猪仔, 用jdk中class对象的newInstance() 创建此 Class 对象所表示的类的一个新实例,这就使得原先静态写死new A()的土办法变得灵活起来了?联想下这个时候你一定很兴奋了,因为你以后设下这个圈套可以不用看见猪跑的情况下一样吃到猪肉,我们再进行一个联系扩展认识:
很多框架的xml配置,为什么它能根据配置自己去创建实例化类,因为xml配置就是一种动态的工具,后面有非常严谨精密的java程序去根据去替你完成对这个类的捕捉与实例化,你完全作为一个用户,被人封装不用再去考虑了,这么一说好像反射就没有什么秘密了一样,其实不然,class对象的用法可谓诡秘强大繁琐异常,是java反射机制的一大亮点,再加上java 70多种的诡异的设计模式,各种匿名内部类,接口,继承的折腾,框架也绝非仅仅只有反射这么简单,好好研究吧,多则10年,少则4年....

#4


学习了。。。。。。。。

#5


如2楼,动态是动态在对象的创建方式的可能性上吧,调用方法谈不上什么动态不动态吧(对象是动态创建的,所以调用它的方法也成动态的了!?)

貌似只有反射(与普通方式相比)才有可能在运行期确定所要实例化的对象类型,普通方式是编译期就一定确定了的

#6


我的理解:
要想得到一个实例,要过new出来。
而反射也可以得到一个实例,而且通过反射得到这个类的所有信息。。。。

#7


引用 2 楼 dr_lou 的回复:
用于字段和方法接入时反射要远慢于直接代码


谈不上远慢于,就是多了几个方法调用,如果方法稍微复杂一点(比get set复杂)可以忽略不计了。

所以用的时候根据需要而定,需要就用,不用考虑性能。性能没问题

#1


运行期才知道被反射对象是什么样的,菜鸟理解。

#2


Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象,无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。Java reflection 非常有用,它使类和数据结构能按名称动态检索相关信息,并允许在运行着的程序中操作这些信息。Java 的这一特性非常强大,并且是其它一些常用语言,如 C、C++、Fortran 或者 Pascal 等都不具备的。

但反射有两个缺点。第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。

#3


有点唬人扯淡,不过等你明白了估计会觉得蛮恶心的,原意就是说你要new 一个类,必须要知道类名才可以,一般都是写死的,因为无法在程序中把 A a=new A();这样的静态写法换成可以替换的变量参数,于是java的设计者们就想出了:是否可以把A这个类也描述成对象.就是描述A这个类的类,根据java万物皆对象的思想,很容易理解,jdk中有个方法叫Class.forName("A"),大家看,我们是不是实现了把A作为一个动态的可以替换的变量参数,最终得到的是这个类运行时期的字节码对象,说白了,就是你虽然你没吃过A猪但是总还可以看见A猪跑的,你把这只跑起来的A猪用工具抓起来,既然我们获取了这个类的字节码对象,那当然就很容易对这个类再创造了,就是让A猪给我下猪仔, 用jdk中class对象的newInstance() 创建此 Class 对象所表示的类的一个新实例,这就使得原先静态写死new A()的土办法变得灵活起来了?联想下这个时候你一定很兴奋了,因为你以后设下这个圈套可以不用看见猪跑的情况下一样吃到猪肉,我们再进行一个联系扩展认识:
很多框架的xml配置,为什么它能根据配置自己去创建实例化类,因为xml配置就是一种动态的工具,后面有非常严谨精密的java程序去根据去替你完成对这个类的捕捉与实例化,你完全作为一个用户,被人封装不用再去考虑了,这么一说好像反射就没有什么秘密了一样,其实不然,class对象的用法可谓诡秘强大繁琐异常,是java反射机制的一大亮点,再加上java 70多种的诡异的设计模式,各种匿名内部类,接口,继承的折腾,框架也绝非仅仅只有反射这么简单,好好研究吧,多则10年,少则4年....

#4


学习了。。。。。。。。

#5


如2楼,动态是动态在对象的创建方式的可能性上吧,调用方法谈不上什么动态不动态吧(对象是动态创建的,所以调用它的方法也成动态的了!?)

貌似只有反射(与普通方式相比)才有可能在运行期确定所要实例化的对象类型,普通方式是编译期就一定确定了的

#6


我的理解:
要想得到一个实例,要过new出来。
而反射也可以得到一个实例,而且通过反射得到这个类的所有信息。。。。

#7


引用 2 楼 dr_lou 的回复:
用于字段和方法接入时反射要远慢于直接代码


谈不上远慢于,就是多了几个方法调用,如果方法稍微复杂一点(比get set复杂)可以忽略不计了。

所以用的时候根据需要而定,需要就用,不用考虑性能。性能没问题