A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

概述
能够分析类能力的程序成为反射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);


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马