Java基础反射reflect

萝らか妹 提交于 2020-03-06 00:07:44

概述

能够分析类能力的程序成为反射reflective。反射机制的功能及其强大,再下面可以看到,反射机制可以用来:

  • 在运行时分析类的能力
  • 在运行时查看对象,例如,编写一个toString()方法供所有类使用。
  • 实现通用的数组操作代码。
  • 利用Method对象,这个对象很像C++中的指针函数。

Class类

在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。

获取类字节码方式

  • Class.forName(); 静态方法调用
Class<?> forName = Class.forName("path");
  • 类型.class
Class<?> cls = Person.class;
  • 对象.class
Person person = new Person();
Class<?> cls = person.class;

常用方法

// 返回描述类名为className的Class对象
static Class forName(String className);

// 返回类的实例对象,调用的是默认无参构造方法
Object newInstance();

Constructor类

/**
* 构造一个这个构造器所属类的新实例
* @param args 这个构造方法所需的形式参数
*/
Object newIntance(Object[] args);

/**
* 获取字节码中所有公开的构造方法
*/
Constructor[] getConstructors();

/**
* 获取所有的构造的方法,包括private修饰的
*/
Constructor<?>[] getDeclaredConstructors();

/**
* 获取指定形参类型,和数量的公开的构造方法
*/
Constructor<T> getConstructor(Class<?>... parameterTypes);

/**
* 获取指定形参类型,和数量的任何修饰符的构造方法
*/
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);

Method类

/**
* 获取所有公开方法
*/
Method[] getMethods();

/**
* 获取所有方法,包括私有方法
*/
Method[] getDeclaredMethods();

/**
* 获取公开方法
* @param name 方法的名称
* @param parameterTypes 形式参数
*/
Method getMethod(String name, Class<?>... parameterTypes)

/**
* 获取指定方法,包括私有方法
* @param name 方法的名称
* @param parameterTypes 形式参数
*/
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
/**
* 调用方法
* @param obj 方法被调用对象
* @param args 形式参数列表
*/
Object invoke(Object obj, Object... args)

Field类

/**
* 获取所有公开成员变量
*/
Field[] getFields();

/**
* 获取所有成员变量
*/
Field[] getDeclaredFields()

/**
* 获取指定名称的公开的成员变量
*/
Field getField(String name)

/**
* 获取指定名称的成员变量
*/
Field getDeclaredField(String name)

/**
* 设置obj指定成员变量值value
* @param obj 需要修改的变量
* @param value 修改的值
*/
void set(Object obj, Object value)

/**
* 获取obj对象的指定成员变量值
*/
Object get(Object obj)

暴力反射

Field name = forName.getDeclaredField("name");
name.setAccessible(true);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!