C114门户论坛百科APPEN| 举报 切换到宽版

亚星游戏官网

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索
查看: 6561|回复: 0

[技术讨论] Java反射使用 [复制链接]

军衔等级:

亚星游戏官网-yaxin222  新兵

注册:2015-12-14
发表于 2021-1-3 13:27:57 |显示全部楼层
[size=1.25em]####类加载器 概念:类加载器负责把.class字节码文件加载到内存中,生成方法区中存储的字节码对象。
     字节码对象中封装了什么东西? 成员变量和成员方法
   
   Java代码 -编译-> 字节码文件 -运行(类加载器把字节码文件变成字节码对象)-> 虚拟机中运行
   
类什么时候被加载?第一次用的时候
     一个类被加载到内存中,只会生成一个字节码对象。
       不管这个类创建了多少个此类对象,都只会有一个字节码对象。
   
Class 代表 类的类。 Java中任何一个类的字节码对象都是Class类的对象。  
     Student -生成-> Student.class对象 <-- Class类加载器的功能 &#128681;类加载器:快速的获取当前模块下src目录下的文件!!(系统类加载器加载文件的相对路径的起点是src的根目录)
   
     static ClassLoader  getSystemClassLoader():获取系统类加载器
     InputStream getResourceAsStream(String name):name传入的是相对路径
         相对路径的起点是当前模块的src的根目录

  &#128681;   static InputStream getSystemResourceAsStream(String name):name传入的是相对路径
         相对路径的起点是当前模块的src的根目录  反射 利用另一种方式去获取一个类的对象、调用类中的方法、使用类中的成员变量。
反射是基于正射。  
   正射: 对象.方法(实际参数)
   反射: 方法对象.invoke(对象,实际参数)

反射代码的编写:
     1、获取一个类的字节码对象 -> Class 类的类
         字节码对象中封装了类中的构造方法、成员变量、成员方法
     2、根据字节码对象获取类中相应的成员对象
          根据字节码对象获取类中 构造方法的对象 -> Constructor
          根据字节码对象获取类中 成员方法的对象 -> Method
          根据字节码对象获取类中 成员变量的对象 -> Field
     3、根据不同的成员对象完成不同的功能
          构造方法对象 -> 创建此类的对象
          成员变量对象 -> 赋值、获取值
          成员方法对象 -> 调用方法如何获取一个类的字节码对象 1、对象.getClass() -> 这个对象所在类的字节码对象
       Class getClass():来自Object类
2、类型.class  -> 类型的名称.class 可以获取到此类型的字节码对象
     Class clazz = String.class;
     Class clazz = int.class;  
     Class clazz = Student.class;
3、Class.forName("类的全类名"); -> 通过一个Class的静态方法获取一个类的字节码对象
       Class clazz = Class.forName("java.lang.String");
       Class clazz = Class.forName("com.itheima.Student");

这三种哪种用的舒服就优先用哪个!!根据字节码对象获取类中的成员构造方法 获取一个类中的构造方法对象的方法来自于Class类:
         Constructor[] getConstructors():获取一个类中所有被public修饰的构造方法对象
         Constructor getConstructor(Class...parameterTypes):获取一个类中指定的被public修饰的构造方法对象
&#128681;    Declared:忽视修饰符
         Constructor[] getDeclaredConstructors():获取一个类中所有的构造方法对象
         Constructor<T> getDeclaredConstructor(Class... parameterTypes):获取一个类中指定的构造方法对象
   
      Class类中有一个快捷的生成一个类无参构造方法对象的方法
             T newInstance():根据无参构造快速的创建一个该类的对象


     来自于 Constructor 类的方法  来实现对象创建
         T newInstance(Object...initargs)
             Object...initargs:启动此构造方法时需要传入的实际参数
             T: 你创建出来的这个对象
        若要去访问类中私有成员,你必须使用成员对象开启暴力反射开关。

         两种创建此类对象的方法
             1、有字节码对象 --> 根据字节码对象获取相应的构造方法对象 --> 此构造方法对象调newInstance方法创建该类对象
                     (private修饰的构造方法记得打开暴力反射开关)
             2、有字节码对象 --> 直接调用Class类中的newInstance方法创建该类的无参对象  成员变量 1、获取一个类的字节码对象
2、获取一个类中成员变量对象的方法来自于Class类
     Field[] getDeclaredFields():获取一个类中所有的成员变量对象
     Field getDeclaredField(String name):获取一个类中指定的成员变量对象
     String name:变量的名字
3、赋值和取值 --> 来自于Field类
       Object get(Object obj):取值
           Object obj:哪一个对象的
       void set(Object obj, Object value):赋值
           Object obj:哪一个对象的
           Object value:你要把这个参数的值设置为多少

   ⚠️: 当成员变量被私有,必须在使用前开启暴力反射成员方法     1、获取一个类的字节码对象
     2、获取一个类中成员方法对象的方法来自于Class类
         Method[] getDeclaredMethods():获取一个类中所有的成员方法对象
         Method getDeclaredMethod(String name, Class... parameterTypes):获取一个类中指定的成员方法对象
             String name:方法名 -> 写方法名字的时候不要加()
             Class...parameterTypes:方法形式参数数据类型的字节码对象
     3、有了方法对象 你就想启动方法  启动方法的方法在Method类中
             Object invoke(Object obj, Object... args):启动方法
                 Object obj:具体调用方法的对象
                 Object... args:启动方法需要你传入的实际参数
                 Object:
                     如果方法有返回值:invoke方法的返回值就是用来接受调用方法的返回值的
                     如果方法没有返回值:invoke方法的返回值就是null

        注意:
             1、启动方法 如果启动的是无返回值的方法就直接调用invoke
             2、因为启动的方法有返回值 所以调用invoke方法的时候记得接受调用
             3、私有方法在启动之前记得开启暴力反射开关


举报本楼

您需要登录后才可以回帖 登录 | 注册 |

手机版|C114 ( 沪ICP备12002291号-1 )|联系大家 |网站地图  

GMT+8, 2024-11-15 13:39 , Processed in 0.209244 second(s), 15 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部
XML 地图 | Sitemap 地图