027.2 反射技术 动态获取字段和方法
##############################################
动态获取字段和暴力访问
String className = "cn.itcast.domain.Person"; Class clazz = Class.forName(className); String fieldName = "age"; //获取age字段对象。 // Field field = clazz.getField(fieldName);//获取是公共的字段。 Field field = clazz.getDeclaredField(fieldName); // getXXX:获取都是类中公共的成员。 // getDeclaredXXX:获取本类中已有的成员。 // System.out.println(field); //对其进行值的设置,必须先有对象。 Object obj = clazz.newInstance(); //通过查找父类AccessiableObject的方法。setAccessiable(true); field.setAccessible(true);//取消权限检查,暴力访问。一般不访问私有。 field.set(obj, 30);//IllegalAccessException:age字段是私有的。 System.out.println(field.get(obj));
##################################################
获取方法
##Person.java … public void show(String name,int age){ System.out.println("show run...name="+name+",age="+age); } public static void staticShow(){ System.out.println("static show run"); } ...
## public static void getMethodDemo2() throws Exception { String className = "cn.itcast.domain.Person"; Class clazz = Class.forName(className); String methodName = "staticShow"; Method method = clazz.getMethod(methodName, null); method.invoke(null, null); } public static void getMethodDemo() throws Exception { String className = "cn.itcast.domain.Person"; Class clazz = Class.forName(className); String methodName = "show"; Method method = clazz.getMethod(methodName, String.class,int.class); Object obj = clazz.newInstance(); method.invoke(obj, "wangcai",20); }