侧边栏壁纸
博主头像
憨憨大头个人博客博主等级

心存希冀,目有繁星

  • 累计撰写 110 篇文章
  • 累计创建 13 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Java反射的用法

Administrator
2024-08-03 / 0 评论 / 0 点赞 / 7 阅读 / 6163 字

反射的基本理解

反射本质就是操作构造方法、成员变量、成员方法

利用另一种方式去获取一个类的对象、调用类中的方法、使用类中的成员变量。
反射是基于正射。
正射: 对象.方法(实际参数)

反射: 方法对象.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");

反射获取 Constructor

通过class对象 获取一个类的构造方法

//通过指定的参数类型, 获取指定的单个构造方法 getConstructor(参数类型的class对象数组) 
Person(String name,int age)

//得到这个构造方法的代码如下:
Constructor c = p.getClass().getConstructor(String.class,int.class);

// 获取构造方法数组 
getConstructors();

// 获取所有权限的单个构造方法 
getDeclaredConstructor(参数类型的class对象数组)

// 获取所有权限的构造方法数组 
getDeclaredConstructors();

Constructor 创建对象

// 调用这个构造方法, 把对应的对象创建出来
	// 参数: 是一个Object类型可变参数, 传递的参数顺序 必须匹配构造方法中形式参数列表的顺序
newInstance(Object... para)
    
// 如果flag为true 则表示忽略访问权限检查 !(可以访问任何权限的方法)
setAccessible(boolean flag)
	

反射获取 Method

通过class对象 获取一个类的方法

// 根据参数列表的类型和方法名, 得到一个方法(public修饰的)
getMethod(String methodName , class.. clss) 
    
// 得到一个类的所有方法 (public修饰的)
getMethods();

// 根据参数列表的类型和方法名, 得到一个方法(除继承以外所有的:包含私有, 共有, 保护, 默认)
getDeclaredMethod(String methodName , class.. clss) 
	
// 得到一个类的所有方法 (除继承以外所有的:包含私有, 共有, 保护, 默认)
getDeclaredMethods();
	

Method 执行方法

/** 
调用方法
参数1. 要调用方法的对象 
参数2. 要传递的参数列表
	*/
invoke(Object o,Object... para) :
	
// 获取方法的方法名称
getName()

// 获取方法的方法名称
setAccessible(boolean flag)
	

反射获取 Field

通过class对象 获取一个类的属性

// 根据属性的名称, 获取一个属性对象 (所有属性)
getDeclaredField(String filedName) 

// 获取所有属性
getDeclaredFields()

// 根据属性的名称, 获取一个属性对象 (public属性)
getField(String filedName)

// 获取所有属性 (public)
getFields() 

Field 属性的对象类型 常用方法:

// 参数: 要获取属性的对象 获取指定对象的此属性值
get(Object o); 

// 参数1. 要设置属性值的 对象 
// 参数2. 要设置的值 设置指定对象的属性的值
set(Object o , Object value);

// 获取属性的名称
getName();

// 如果flag为true 则表示忽略访问权限检查 !(可以访问任何权限的属性)
setAccessible(boolean flag);

通过反射获取注解信息

获取类/属性/方法的全部注解对象

Annotation[] annotations01 = Class/Field/Method.getAnnotations();

for (Annotation annotation : annotations01) {
    System.out.println(annotation);
}

根据类型获取类/属性/方法的注解对象

注解类型 对象名 = (注解类型) c.getAnnotation(注解类型.class);

内省 Introspector

基于反射 , java所提供的一套应用到JavaBean的API

Java提供了一套java.beans包的api , 对于反射的操作, 进行了封装

在这里插入图片描述

获取Bean类信息

// 通过传入的类信息, 得到这个Bean类的封装对象 
BeanInfo getBeanInfo(Class cls) 
获取bean类的 get/set方法 数组
// 常用的方法:
MethodDescriptor[] getPropertyDescriptors():

MethodDescriptor

// 获取一个get方法
Method getReadMethod();

// 获取一个set方法
Method getWriteMethod();
0

评论区