13反射机制

概念

反射允许对成员变量,成员方法和构造方法的信息进行编程访问。

通过字节码文件可以获取这个类的成员变量,构造方法和成员方法,以及他们各自的修饰符,名称,数据类型,形参,返回值,抛出的异常等。

在所有操作之前,首选需要获取Class对象

获取Class对象

有三种方式

  1. Class.forName(“全类名”);
  2. 类名.class
  3. 对象.getClass();
package com.test

public class Test{
	public static void main(String[] args){
		//方式一,使用Class.forName("全类名")
		Class user1 = Class.forName("com.test.User");

		//方式二,使用类名.class
		Class user2 = User.class;

		//方式三,使用对象获取
		User user = new User();
		Class user3 = user.getClass();
	}
}
class User{}

注:最常用的是第一种方式
获取Class对象之后就可以获取其他的内容

获取构造方法

方法 描述
Constructor<?>[]getConstructors() 返回公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组
Constructor getConstructor(Class<?>… parameterTypes) 返回单个公共构造方法对象
Constructor getDeclaredConstructor(Class<?>… parameterTypes) 返回单个构造方法对象

注:小括号里写想要获取构造方法的形参变量,例如String.class,int.class

  • 获取其访问修饰符只需要调用getModifiers();,返回值是int类型,public是1,private是2
  • 获取构造方法的形参的数组,Parameter[] getParameters();
  • 使用获取的Class对象创建对象Object<> newInstance(参数),里面的参数要与构造方法中的参数保持一致

暴力反射:若获取的构造方法对象是私有的,则可以使用
void setAccessible(true);临时取消权限验证,这样在外部也可以直接访问该方法。

获取成员变量

方法 描述
Field[] getFields() 获取所有公开的成员变量数组
Field[] getDeclaredFields() 获取所有的变量对象的数组
Field getField(String name) 返回单个公共成员变量对象
Field getDeclaredField(String name) 返回单个成员变量对象

获取成员变量对象后可以获取其:修饰符,变量名,数据类型,成员变量记录的值并且可以修改其记录的值

  • int getModifiers();
  • String getName();
  • Class<?> getType();
  • Object get(要获取的值所在的对象);
  • void set(要修改的值所在的对象,值)

获取成员方法

方法 描述
Method[] getMethods() 返回所有公共成员方法对象,包括继承的
Method[] getDeclaredMethods() 返回所有成员方法对象,不包括继承的
Method getMethod(String name, Class<?>… parameterTypes) 返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>… parameterTypes) 返回单个成员方法对象

注:小括号中第一个是方法名,第二个是方法的形参列表

获取方法的形参列表
Parameter[] getParameters();
获取方法抛出的异常
Class[] getExceptionTypes();
运行获取出的方法
Class<> invoke(方法调用者,实参)

相关推荐

  1. 13反射机制

    2024-04-24 09:50:05       35 阅读
  2. Python的反射机制

    2024-04-24 09:50:05       39 阅读
  3. QT5.14.2深入剖析Qt反射机制的实现原理

    2024-04-24 09:50:05       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-24 09:50:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-24 09:50:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-24 09:50:05       82 阅读
  4. Python语言-面向对象

    2024-04-24 09:50:05       91 阅读

热门阅读

  1. CentOS 7 常用命令大全

    2024-04-24 09:50:05       35 阅读
  2. C语言-结构体基本概念

    2024-04-24 09:50:05       30 阅读
  3. css设置子元素在父元素中水平垂直居中

    2024-04-24 09:50:05       35 阅读
  4. [网络编程]socket嵌套字的一些常用接口

    2024-04-24 09:50:05       29 阅读
  5. equals和==有什么区别?

    2024-04-24 09:50:05       39 阅读