反射其实是通过Class对象来调用类里面的方法(无参无返回,无参有返回,有参数无返回,有参数有返回)或者属性,反射还可以调用私有方法和私有属性。
反射的使用方法:
System.out.println("-----------------属性-----------------------");
// 1.得到你的类的对象
Class c = Class.forName("com.zking.entity.Person");
Field f = c.getDeclaredField("pname");
// 设置私有的属性能够被访问
f.setAccessible(true);
System.out.println(f);
// 得到一个person对象 newInstance 产生一个新的实列 实列化对象
Object person = c.newInstance();
// 赋值
f.set(person, "张三");
// 取值
f.get(person);
System.out.println(f.get(person));
//获取所有属性
// System.out.println("-----------------属性-----------------------");
// Class c = Class.forName("com.zking.entity.Person");
// Field[] fields = c.getDeclaredFields();
// Object person = null;
// for (Field f : fields) {
// f.setAccessible(true);
// person = c.newInstance();
// if ("pid".contains(f.getName())) {
// f.set(person, "M01");
// } else if ("pname".contains(f.getName())) {
// f.set(person, "张三");
// } else if ("sex".contains(f.getName())) {
// f.set(person, 18);
// }
// System.out.println(f.get(person));
// }
方法:(无参无返回,无参有返回,有参数无返回,有参数有返回)
// 无参无返回
public void m1() {
System.out.println("无参无返回");
}
// 无参有返回
public String m2() {
return "m2";
}
// 有参数无返回
public void m3(Integer index, String str, String str1) {
System.out.println("有参数无返回");
}
// 有参数有返回
public String m4(Integer index, String str, String str1) {
return index + str + str1;
// 方法
System.out.println("-----------------方法-----------------------");
Class c1 = Class.forName("com.zking.reflect.DemoPerson");
Object obj = c1.newInstance();
Method m1 = c1.getMethod("m1", null);
m1.invoke(obj, null);
Method m2 = c1.getMethod("m2", null);
System.out.println(m2.invoke(obj, null));
Method m3 = c1.getMethod("m3", Integer.class, String.class, String.class);
m3.invoke(obj, null, null, null);
Method m4 = c1.getMethod("m4", Integer.class, String.class, String.class);
System.out.println(m4.invoke(obj, null, null, null));
}
使用反射可以
增加程序的灵活性。