[JavaFX] 纯文本查看 复制代码
/*
* 演示:三种获取Class的方式:
* 方式1:类名.class
* 方式2:对象.getClass()
* 方式3:Class.forName(String classname)必须传类的全名!!
*/
public class ReflectDemo01 {
public static void main(String[] args) throws ClassNotFoundException {
// 方式1:类名.class
Class c1 = String.class;
System.out.println(c1.getSimpleName());
System.out.println(c1.getName());
// 方式2:对象.getClass()
Class c2 = "".getClass();
System.out.println(c2.getSimpleName());
System.out.println(c2.getName());
// 方式3:Class.forName(String classname)
Class c3 = Class.forName("java.lang.String");
System.out.println(c3.getSimpleName());
System.out.println(c3.getName());
System.out.println(c1 == c2);// true
System.out.println(c1 == c3);// true
System.out.println(int.class);
System.out.println(void.class);
}
}
2.2反射获取构造函数
[Java] 纯文本查看 复制代码
/*
* 演示:反射获取构造函数:
* Constructor[] getConstructors() 获取所有公共的构造函数
* Constructor[] getDeclaredConstructors() 获取所有声明的构造函数
* Constructor getConstructor(Class ... parameterTypes)获取指定的公共构造函数
* Constructor getDeclaredConstructor(Class ... parameterTypes) 获取指定的声明的构造函数
* 创建对象:
* T newInstance(Object... initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例
*
* 如果一个类有公共的空参构造,此时,你就可以直接用字节码文件对象.newInstance()来创建对象
*/
public class ReflectDemo02 {
public static void main(String[] args) throws Exception {
Class clazz = Student.class;
// Constructor[] getConstructors() 获取所有公共的构造函数
// Constructor[] cons = clazz.getConstructors();
// for (Constructor con : cons) {
// System.out.println(con);// public cn.itcast.reflect.Student()
// }
// Constructor[] getDeclaredConstructors() 获取所有声明的构造函数
// Constructor[] cons = clazz.getDeclaredConstructors();
// for (Constructor con : cons) {
// System.out.println(con);
// }
// Constructor getConstructor(Class ... parameterTypes)获取指定的公共构造函数
Constructor con = clazz.getConstructor();
System.out.println(con);// public cn.itcast.reflect.Student()
// Constructor getDeclaredConstructor(Class ... parameterTypes)
// 获取指定的声明的构造函数
// 获取私有的private Student(String name, int age, String addr)
Constructor con2 = clazz.getDeclaredConstructor(String.class, int.class, String.class);
System.out.println(con2);
// T newInstance(Object... initargs) 使用此 Constructor
// 对象表示的构造方法来创建该构造方法的声明类的新实例,
// 空参构造创建对象
Student s1 = (Student) con.newInstance();
System.out.println(s1);
// 有参构造
// 暴力访问:
con2.setAccessible(true);
Student s2 = (Student) con2.newInstance("小江哥", 21, "杭州");
System.out.println(s2);
// 通过字节码文件对象,直接生产本类对象
Object obj = clazz.newInstance();
System.out.println(obj);
}
}
2.3反射获取成员变量
[Java] 纯文本查看 复制代码
/*
* 演示:反射获取成员变量:
* Field[] getFields()获取所有公共字段
* Field[] getDeclaredFields() 获取所有声明字段
* Field getField(String name) 获取指定的公共字段
* Field getDeclaredField(String name) 获取指定任意字段
* 获取字段值或设置字段值
* set(Object obj, Object value)将obj对象上此 Field 表示的字段设置为指定的值
* Object get(Object obj)获取指定对象上当前字段的值
*/
public class ReflectDemo03 {
public static void main(String[] args) throws Exception {
// 我们要反射的对象
Student s = new Student("小江哥", 21, "杭州");
// 获取字节码
Class clazz = s.getClass();
// Field[] getFields()获取所有公共字段
// Field[] fields = clazz.getFields();
// for (Field f : fields) {
// System.out.println(f);// public int cn.itcast.reflect.Student.age
// }
// Field[] getDeclaredFields() 获取所有声明字段
// Field[] fields = clazz.getDeclaredFields();
// for (Field f : fields) {
// System.out.println(f);
// }
// Field getField(String name) 获取指定的公共字段
Field f1 = clazz.getField("age");
System.out.println(f1);// public int cn.itcast.reflect.Student.age
// Field getDeclaredField(String name) 获取指定任意字段
Field f2 = clazz.getDeclaredField("addr");
System.out.println(f2);// private java.lang.String cn.itcast.reflect.Student.addr
// 获取字段值:
int age = (int) f1.get(s);
System.out.println(age);// 21
// 修改字段值
f2.setAccessible(true);
f2.set(s, "北京");
System.out.println(s);// Student [name=小江哥, age=21, addr=北京]
}
}
2.4反射获取成员方法
[Java] 纯文本查看 复制代码
/*
* 演示:反射获取成员方法:
* Method[] getMethods() 获取所有公共成员方法,包含继承自父类的
* Method[] getDeclaredMethods() 获取所有声明的方法,只要自己声明的方法。
* Method getMethod(String methodName, Class ... parameterTypes) 获取指定的公共方法
* Method getDeclaredMethod(String methodName, Class ... parameterTypes) 获取指定的声明方法
* 调用方法
* Object invoke(Object obj, Object... args) 调用指定对象obj的当前method表示的方法
*/
public class ReflectDemo04 {
public static void main(String[] args) throws Exception {
Student s = new Student("小江哥", 21, "杭州");
Class clazz = s.getClass();
// Method[] getMethods() 获取所有公共成员方法
// Method[] methods = clazz.getMethods();
// for (Method m : methods) {
// System.out.println(m);
// }
// Method[] getDeclaredMethods() 获取所有声明的方法
// Method[] methods = clazz.getDeclaredMethods();
// for (Method m : methods) {
// System.out.println(m);
// }
// Method getMethod(String methodName, Class ... parameterTypes) 获取指定的公共方法
// public void show(String desc)
Method m = clazz.getMethod("show", String.class);
System.out.println(m);// public void cn.itcast.reflect.Student.show(java.lang.String)
// Method getDeclaredMethod(String methodName, Class ... parameterTypes) 获取指定的声明方法
Method m2 = clazz.getDeclaredMethod("show");
System.out.println(m2);// private static void cn.itcast.reflect.Student.show()
// 举例:我们调用show(String desc)
// 非反射调用:
s.show("一个技术宅!");
// 反射调用
m.invoke(s, "一个胸怀宽广的人!");
// Object invoke(Object obj, Object... args) 调用指定对象obj的当前method表示的方法
// 演示:无参静态方法 private static void show()
m2.setAccessible(true);
m2.invoke(null);
// 带返回值方法
Method m3 = clazz.getMethod("toString");
String str = (String) m3.invoke(s);
System.out.println(str);
}
}
2.5实战[Java] 纯文本查看 复制代码
/*
* 演示:用反射模拟一个BeanUtils的populate方法
*/
public class ReflectDemo05 {
public static void main(String[] args) throws Exception {
Student s = new Student();
Map<String,Object> m = new HashMap<>();
m.put("name", "小江哥");
m.put("age", 21);
m.put("addr", "杭州");
myPopulate(s, m);
System.out.println(s);// Student [name=小江哥, age=21, addr=杭州]
}
/*
* 定义一个功能:实现把一个Map中的属性,设置到一个对象中
*/
public static void myPopulate(Object o, Map<String,Object> m) throws Exception{
// 获取对象的字节码文件对象
Class<?> clazz = o.getClass();
// 反射获取所有成员变量数组
Field[] fields = clazz.getDeclaredFields();
// 循环遍历,取出每个成员
for (Field f : fields) {
// 获取成员的名字
String name = f.getName();
// 从map中根据键找值
Object value = m.get(name);
if( value != null){
// 把这个值设置给当前字段
f.setAccessible(true);
f.set(o, value);
}
}
}
}