反射
程序运行期间,JVM会对类文件创建字节码文件对象,利用这个文件对象,对这个
class文件进行解剖,直接获取成员,调用这些成员。这种动态的获取一个类中的信
息,就是反射技术
如何获取字节码文件对象?
方式1:getClass():返回进行时的类
方式2:类名.class静态属性,来获取当前数据类型的字节码文件对象
方式3:public static Class forName(String className)返回与带有给定字符串名
的类或接口相关联的Class对象
构造函数:Constructor
public Constructor[] getConstructors():获取所有的公共的构造函数
public Constructor[] getDeclaredConstructors();获取所有的构造函数(包含私有)
public Constructor getConstructor(Class<?>...parameterTypes)获取指定的构造函数
public void setAccessible(boolean flag);是否可以访问(暴力访问)
步骤
1、创建一个Class字节码文件对象
2、非public权限的构造函数,需要强制访问
3、创建对象
例:
import java.lang.reflect.*;
public class ReflectDemo4 {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("cn.itcast.reflect.Person");
//获取私有构造方法 int参数
Constructor con = clazz.getDeclaredConstructor(int.class);
//调用Constructor父类(AccessibleObject)方法 setAccessible(true)
//setAccessible反射的时候,取消访问检查
con.setAccessible(true);
Object obj = con.newInstance(331);//构造函数,传递实际参数
System.out.println(obj);
}
}
获取成员变量:Field
public Field[] getFields()获取public修饰的所有字段
public Field[] getDeclareFields()获取所有的字段(包含私有)
public Field[] getField(String name)获取指定的字段
public Field[] getDeclareField(String name)获取所有的字段(包含私有)
为指定对象中的当前字段,赋值
public void set(Object obj,Object value);
步骤:
1、创建class字节码文件对象
2、获取指定的字段,如果是非public修饰的字段,需要暴力访问
3、对字段进行操作
调用给定的对象中的当前方法,并且给定方法的参数列表,这个时候就可以确定调用的是具体的哪个方法了
public Object invoke(Object obj,Object..args)
获取方法:Method
public Method[] getMethods()包含父类
public Method[] getDeclareMethods()获取所有的方法(不包含父类)
public Method[] getMethod(String name,Class<?>...parameterTypes)获取指定的方法
public Method[] getDeclareMethod(String name,Class<?>...parameterTypes)获取所有的方法(包含私有)
调用给定
步骤:
1、创建class字节码文件对象
2、获取指定的方法
3、使用方法(需要前有对象,才能使用方法)
|
|