定义:获取当前某个类的字节码文件
获取一个类的字节码文件对象有几种方式:
1.Object的getClass()方法:
对象名.getClass()
2.任意Java类型的class属性--->内置的,就相当于任意数组(引用类型数组,基本数组---都会有length属性) 可以jdk提供的类或者我们自定义的类
类名.class();
3.Class.forName("包名.类名"); 字符串数据----特点--->可以放在配置文件
类的加载过程---->需要类的所有结构(成员变量/构造方法/成员方法)进行校验
构造方法:
通过字节码文件对象,获取这个类 构造方法的类对象:Constructor---给创建当前类实例
getConstructors():获取当前这个类的所有的公开的构造方法
getDeclaredConstructors():获取当前类的所有构造方法(公共的,受保护的,私有的,默认的)
getDeclaredConstructor(参数类型的class):获取指定构造方法
setAccessiable(true):取消对非公共的构造方法/成员方法取消java语言检查
newInstance(实参):创建当前实例对象
Class c=Class.forName("com.qf.reflect_04.Person");
//Constructor con=c.getConstructor();
Constructor con=c.getDeclaredConstructor(String.class,int.class);
con.setAccessiable(true);
Object o=con.newInstance("luya",20);
System.out.println(o);
成员方法
获取指定的公共的成员方法类对象Method:
public Method getDeclaredMethod(String name,Class<?>... parameterTypes):
参数1:方法名,参数2:参数类型的字节码文件
Method m2 = clazz.getDeclaredMethod("method", String.class);
传值:调用invoke方法:
m2.invoke(obj,"hello,高圆圆") ;
成员变量
//public Field getDeclaredField(String name):获取指定的字段类对象(获取指定成员变量)---参数为当前成员变量名
Field ageField = clazz.getDeclaredField("age") ;
//取消Java语言访问检查
ageField.setAccessible(true);
//才能赋值
//public void set(Object obj, Object value):将指定的value实际参数 作用指定的实例(对象)上
ageField.set(obj,20) ;
System.out.println(obj);