【动力节点 Java进阶学习笔记】第八章 反射机制

1、什么是反射机制、反射机制的作用和相关的类

  • 反射机制:可以操作字节码文件
  • 作用:可以让程序更加灵活。
  • 相关类:
           java.lang.Class:代表整个字节码,代表一个类型,代表整个类。
           java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。
           java.lang.reflect.Constructor:代表字节码中的构造方法字节码。代表类中的构造方法
           java.lang.reflect.Field:代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)。

2、获取Class的三种方式、通过获取的Class实例化对象、获取文件的绝对路径

  • 获取Class的三种方式
           Class.forName()
           <对象>.getClass()
           xxx.class(如int.class;String.class)
  • 通过获取的Class实例化对象:newInstance()
           newInstance()底层调用的是该类型的无参数构造方法。
  • 获取绝对路径
           Thread.currentThread.getContextClassLoader.getResource(<src开始的相对路径>).getPath()
  • 获取文件流
           Thread.currentThread.getContextClassLoader.getResourceAsStream(<src开始的相对路径>)
  • 资源绑定
           ResourceBundle bundle =ResourceBundle.getBundle(<properties文件路径>)
           这个文件必须在类路径下(src路径下),文件扩展名也必须是properties,并且在写路径的时候,路径后面的扩展名不能写。
           获取value:bundle.getString()

3、类加载器的概念、分类以及双亲委派机制

  • 启动类加载器 : rt.jar

  • 扩展类加载器 : ext/*.jar

  • 应用类加载器 : classpath

  • java中为了保证类加载的安全,使用了双亲委派机制
           优先从启动类加载器中加载,这个称为“父”
           “父”无法加载到,再从扩展类加载器中加载,这个称为“母”。双亲委派。
            如果都加载不到,才会考虑从应用类加载器中加载,直到加载到为止。

4、通过反射机制反射属性、如何读取和修改属性值

  • 获取所有Field: <class>.getDeclaredFields()
  • 获取属性的修饰符:Modifer.toString(<field>.getModifiers())
  • 获取属性的数据类型:<field>.getType().getSimpleName()
  • 获取属性的数据名称:<field>.getName()
  • 给obj对象的某个属性赋值:<field>.set(<object>,<value>)
           赋值三要素:对象、属性、值
  • 读取obj对象的属性值: <field>.get(<object>)
  • 私有属性无法直接读取,需要打破封装:<field>.setAccessible(true)

5、通过反射机制反射方法、如何调用对象的某个方法

  • 可变长度参数:类型… 变量名; 如m1(int… args)
  • 获取所有Method: <class>.getDeclaredMethods()
  • 获取方法的修饰符:Modifer.toString(<method>.getModifiers())
  • 获取方法的返回值:<method>.getReturnType().getSimpleName()
  • 获取方法名:<method>.getName()
  • 获取方法的形参列表:Class[] <method>.getParametersTypes()
                                        <class>.getSimpleName()
  • 通过反射机制调用对象的某个方法
           获取指定方法:<class>.getDeclaredMethod(<方法名>, Class… parameterTypes)
                                如(login, String.class, String.class)
           调用方法:Object obj = <method>.invoke(obj, Class… parameterTypes)

6、通过反射机制反射构造方法、如何调用构造方法实例化对象

  • 获取constuctor:Constructor[] .getDeclaredConstructors();
  • 获取修饰列表:Modifer.toString(<constructor>.getModifiers())
  • 获取方法名:<constructor>.getName() 或 <class>.getSimpleName()
  • 获取形参列表:Class[] <constructor>.getParameterTypes()
  • 调用构造方法
           <class>.getDeclaredConstructor(Class… parameterTypes)
            <constructor>.newInstance(Class… parameterTypes)

7、通过反射机制获取父类以及父类型接口

  • 获取父类:<class>.getSuperclass()
  • 获取实现的接口:Class[] <class>.getInterfaces()

版权声明:本文为weixin_43785509原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。