反射机制的简单介绍<



反射的概述

            JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
            对于任意一个对象,都能够调用它的任意一个方法和属性;
            这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
            要想解剖一个类,必须先要获取到该类的字节码文件对象。

            而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

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

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

           Class对象的由来是将class文件读入内存,并为之创建一个Class对象。

      2.知识剖析
        


        
            <p>1.类的加载</p>
            <p>2.类对象</p>
            <p>3.基本使用方法</p>
       



            <p>类的加载</p>
            <p>类的加载指的是将类的class文件读入内存中,并为之创建一个java.lang.Class对象。 </p>
            <p>也就是说,当程序使用任何类时,系统都会为之建立一个java.lang.Class对象</p>
            <p>类的加载由类加载器完成,类加载器通常由JVM提供</p>
  


   
            <p style="text-align:left">类对象</p>
            <p style="text-align:left">类是某一类对象的抽象,同样,Class是对类进行的抽象,类的本质实际上也是一个对象</p>
            <p style="text-align:left">类对象用来存储类的基本信息:类大小,类名称,类的版本,继承层次,以及消息与函数的映射表等</p>




            <p style="text-align:left">基本使用方法:</p>




            <p style="text-align:left">获取类对象</p>
            <p style="text-align:left">Class.forName,类.class,对象.getClass()</p>
            <p style="text-align:left">创建对象: </p>
            <p style="text-align:left">1.使用Class对象的newInstance()方法来创建对应类的实例 </p>
            <p style="text-align:left">2.使用Class对象获取Constructor对象,在调用Constructor对象的NewInstance方法来创建对应的实例 </p>




        访问成员变量</p>
         Class对象的getField()方法可以获取该类的成员变量</p>
        然后使用Field对象提供的两个方法可以读取和设置成员变量</p>
        1.getXxx(Object obj)</p>
        2.setXxx(Object obj,Xxx val)</p>
        



       调用方法:</p>
      通过Class对象的getMethod()可以获取指定的方法,返回一个Method对象</p>
        每个Method方法对应一个方法,通关它的invoke()方法来调用相应的方法</p>
      



            <h3>3.常见问题</h3>



      
            <p>反射的缺点</p>
            
 



            <h3>4.解决方案</h3>




            <p>性能第一</p>
            <p>反射包括了一些动态类型,所以 JVM 无法对这些代码进行优化。</p>
            <p>因此,反射操作的效率要比那些非反射操作低得多。</p>
            <p>我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用反射。</p>

            <p>安全限制</p>
            <p>使用反射技术要求程序必须在一个没有安全限制的环境中运行。</p>
            <p>如果一个程序必须在有安全限制的环境中运行,如 Applet,那么这就是个问题了。</p>

            <p>内部暴露</p>
            <p>由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法)</p>
            <p>所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。 </p>
            <p>反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。</p>
  
            <h3>5.编码实战</h3>
      


   
            <h3>6.扩展思考</h3>
      



            <p style="text-align:left"></p>



       
            <h3>7.参考文献</h3>
      



            <p>https://blog.csdn.net/cnzl0123/article/details/73459750</p>
            <p>https://blog.csdn.net/sinat_38259539/article/details/71799078</p>
            <p>https://www.zhihu.com/question/24304289</p>
   


            <h3>8.更多讨论</h3>



      
            <h4>Thanks</h4>
      
            <p><small>By : 上海分院 罗佳超</small></p>
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值