【动力节点 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版权协议,转载请附上原文出处链接和本声明。