获取Class类的三种方式
/**
* 要操作一个类的字节码,需要首先获取到这个类的字节码,怎么获取java.lang.Class实例?
* 三种方式
* 第一种:Class c = Class.forName("完整类名带包名");
* 第二种:Class c = 对象.getClass();
* 第三种:Class c = 任何类型.class;
*/
public class ReflectDemo01 {
}
通过反射机制访问一个java对象的属性
/**
* 必须掌握
* 怎么通过反射机制访问一个java对象的属性
* 给属性赋值set
* 获取属性的值get
*/
public class ReflectDemo02 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
// 使用反射机制,怎么去访问一个对象的属性。(set get)
Class studentClass = Class.forName("com.dongsheng.javase.reflect.Student");
Object obj = studentClass.newInstance(); // obj就是Student对象。(底层调用无参数构造方法)
// 获取name属性(根据属性的名称来获取Field)
Field nameField = studentClass.getDeclaredField("name");
// 打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会!!!)
// 这样设置完之后,在外部也是可以访问private的。
nameField.setAccessible(true);
// 给obj对象(Student对象)的name属性赋值
/*
虽然使用了反射机制,但是三要素还是缺一不可:
要素1:obj对象
要素2:no属性
要素3:2222值
*/
nameField.set(obj,"zhangsan"); // 给obj对象的name属性赋值zhangsan
// 读取属性的值
// 两个要素:获取obj对象的no属性的值。
System.out.println(nameField.get(obj));
}
}
通过反射机制怎么调用一个对象的方法
/**
* 重点:必须掌握,通过反射机制怎么调用一个对象的方法?
* 五颗星*****
*
* 反射机制,让代码很具有通用性,可变化的内容都是写到配置文件当中,
* 将来修改配置文件之后,创建的对象不一样了,调用的方法也不同了,
* 但是java代码不需要做任何改动。这就是反射机制的魅力。
*/
public class ReflectDemo03 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
// 使用反射机制来调用一个对象的方法该怎么做?
Class studentClass = Class.forName("com.dongsheng.javase.reflect.Student");
// 创建对象
Object obj = studentClass.newInstance();
// 获取Method
Method setName = studentClass.getDeclaredMethod("setName", String.class);
// 调用方法
setName.invoke(obj, "小明");
Method getName = studentClass.getDeclaredMethod("getName");
Object retValue = getName.invoke(obj);
System.out.println(retValue);
}
}