type
status
date
slug
summary
tags
category
icon
password
URL
文章来源说明

概念

反射:将类的各个组成部分封装为其他对象,这就是反射机制。
好处:
1. 可以在程序运行过程中,操作这些对象。 2. 可以解耦,提高程序的可扩展性。
notion image
 

获取class对象方式

  1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中。读取文件,加载类
  1. 类名.class:通过类名的属性class获取
多用于参数的传递
  1. 对象.getClass():getClass()方法在Object类中定义着。
多用于对象的获取字节码的方式
 
结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

Class对象功能

获取成员变量

  • Field[] getFields() :获取所有public修饰的成员变量
  • Field getField(String name) 获取指定名称的 public修饰的成员变量
  • Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
  • Field getDeclaredField(String name)

Field:成员变量

1. 设置值 void set(Object obj, Object value) 2. 获取值 get(Object obj) 3. 忽略访问权限修饰符的安全检查(暴力反射) setAccessible(true)
 
 

获取构造方法

  • Constructor<?>[] getConstructors()
  • Constructor<T> getConstructor(Class<?>... parameterTypes)
  • Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
  • Constructor<?>[] getDeclaredConstructors()
Constructor:构造方法
创建对象:T newInstance(Object... initargs)
如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
示例:
 

获取成员方法

  • Method[] getMethods() :获取类里面所有的public方法,包括父类里面的public方法
  • Method getMethod(String name, 类<?>... parameterTypes)
  • Method[] getDeclaredMethods() :获取类里面声明的所有的方法,不包括父类的方法
  • Method getDeclaredMethod(String name, 类<?>... parameterTypes)
 

Method:方法对象

执行方法:Object invoke(Object obj, Object... args)
获取方法名称:String getName
 

解析注解

在程序使用(解析)注解:获取注解中定义的属性值
  1. 获取注解定义的位置的对象 (Class,Method,Field)
  1. 判断注解是否存在
  • isAnnotationPresent(Class)
  1. 获取指定的注解
  • getAnnotation(Class)
  1. 调用注解中的抽象方法获取配置的属性值
 
 
致谢:
💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
 
 
注解和内部类jdk 动态代理
Loading...