您的位置:首页 > 编程语言 > Java开发

Java反射

2016-05-03 22:01 531 查看

反射基础

java程序中的许多对象在运行时都会出现这两种类型:
编译时类型
运行时类型
,比如:Person p = new Student();

1. 获取Class对象

使用Class类的forName(String clazzName)静态类方法。传入的字符串参数值是某个类的全限定类名

调用某个类的class属性。比如,Person.class

调用某个对象的getClass()方法,返回对象所属类对应的Class对象

一旦获得了某个类对应的Class对象之后,就可以通过调用Class对象的方法来获得该对象和该类的真实消息

2. 从Class中获取信息

1)构造函数

1. Constructor<T> getConstructor(Class<?>... parameterTypes)
返回此Class对象对应类的、带指定形参列表的public构造器

2. Constructor<?>[] getConstructors()
返回此Class对象对应类的所有public构造器

3. Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回此Class对象对应类的、带指定形参列表的构造器,与构造器的权限无关

4. Constructor<?>[] getDeclaredConstructors()
返回此Class对象对应类的所有构造器,与构造器的权限无关


2)方法

1. Method[] getMethods()
返回此Class对象对应类的所有public方法

2. Method getMethod(String name, Class<?>... parameterTypes)
返回此Class对象对应类的、带指定形参列表的public方法

3. Method getDeclaredMethod(String name, Class<?>... parameterTypes)
返回此Class对象对应类的、带指定形参的方法, 与方法的权限无关

4. Method[] getDeclaredMethods()
返回此Class对象对应类的全部方法,与方法的权限无关


3)成员变量

1. Field[] getDeclaredFields()
返回此Class对象对应类的所有成员变量,与权限无关

2. Field getDeclaredField(String name)
返回此Class对象对应类的、指定名称的成员变量,与权限无关

3. Field[] getFields()
返回此Class对象对应类的所有public成员变量

4. Field getField(String name)
返回此Class对象对应类的、指定名称的public成员变量


其他请参考API

使用反射生成对象

使用Class对象的newInstance()方法来创建Class对象对应类的实例,这种方式要求该Class对象的对应类有默认构造函数。

先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例。

使用反射调用方法

当获得某个类对应的Class对象时,就可以通过该Class对象的getMethods()或者getMethod()方法来获取Method数组或Method对象,每个Method对象对应一个方法,可以通过
Object invoke(Object obj, Obejct... args)
来调用它对应的方法

注意
私有方法
,需要通过setAccessible(boolean flag)来控制权限

使用反射访问成员变量

使用Class对象的getFields()或getFiled()方法可以获取该类的成员变量,然后通过Field的提供方法
getXxx(Object obj)
setXxx(Object obj, Xxx val)
来获取或修改成员变量的值

当访问私有成员变量时,需要设置setAccessbile
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: