标签:
1. 核心理解:通过类名动态生成类,并对该类的动态属性----方法,进行操作。
2. 实例说明
package com.lxh.reflact; public class A { @SuppressWarnings("unused") private String name = "ddd"; protected int age; // 构造方法 public A() { } public A(String name, int age) { this.name = name; this.age = age; } // 普通方法 protected void showMess() { System.out.println("Hello World ..."); } public void showMess2(String s) { System.out.println("Hello World2 ...\t" + s); } @SuppressWarnings("unused") private void showMess3() { System.out.println("Hello World3 ..."); } @SuppressWarnings("unused") private void showMess4(String s) { System.out.println("Hello World4 ...\t" + s); } }
package com.lxh.reflact; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 通过java反射实现对目标类的字段和属性进行操作 */ public class ReflectTest { @SuppressWarnings("rawtypes") public static void main(String[] args) { try { Class<?> a = Class.forName("com.lxh.reflact.A"); System.out.println(A.class.isInstance(a)); System.out .println("$$$$$$$$$$$$$$$$$$$$$$$$反射获取所有方法$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); Method met[] = a.getDeclaredMethods(); // Method.setAccessible(met, true);// // 可以获取private,protected类型的方法 for (Method m : met) { System.out.println(m); } System.out .println("$$$$$$$$$$$$$$$$$$$$$$$$反射获取构造方法$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); Constructor cons[] = a.getConstructors(); for (Constructor con : cons) { System.out.println(con); } System.out .println("$$$$$$$$$$$$$$$$$$$$$$$反射获取单个方法并执行$$$$$$$$$$$$$$$$$$$$$$$$$$$"); Object obj2 = a.newInstance(); Class arg[] = new Class[] { String.class };// 注意对有参函数调用的辅助参数 Method m2 = a.getDeclaredMethod("showMess4", arg); System.out.println(m2); m2.setAccessible(true); m2.invoke(obj2, "lxh"); // 此时能调用private修饰的方法 System.out .println("$$$$$$$$$$$$$$$$$$$$$$$$$$$反射获取所有字段及值$$$$$$$$$$$$$$$$$$$$$$$"); Field fds[] = a.getDeclaredFields(); Field.setAccessible(fds, true);// 可以获取private,protected类型的字段 for (Field f : fds) { System.out.println(f.getName() + "\t" + f.get(a.newInstance())); } System.out .println("======================获取单个字段并进行修改======================"); Object obj = a.newInstance(); Field f = a.getDeclaredField("name"); f.setAccessible(true);// 可以操作private,protected类型的字段 System.out.print("原 值:\t"); System.out.println("name:\t" + f.get(obj)); f.set(obj, "lxh4"); System.out.print("更新后:\t"); System.out.println("name:\t" + f.get(obj)); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
package com.lxh.reflact; /** * java反射机制实例的判断 */ public class ReflectTest2 { public static void main(String[] args) { try { Class<?> a = Class.forName("com.lxh.reflact.A"); Object obj = a.newInstance(); System.out.println("============判断a是否为A类的一个实例==========="); System.out.println(a+"\t"+a.isInstance(a)); // ---->false,原因同 A.class.isInstance(A.class) System.out.println(a.isInstance(obj));// true System.out.println(a.getClass().isInstance(a));// true System.out.println("============判断a.newInstance()是否为A类的一个实例:"); System.out.println("a:"+a+"\tb:"+obj); System.out.println(a.isInstance(obj));// ---->true System.out.println(a.getClass().isInstance(obj));// false System.out.println("============判断a是否A类属于同一个类:"); System.out.println(a.isAssignableFrom(obj.getClass()));// true System.out.println(a+", "+a.getClass()+"\t\t"+a.isAssignableFrom(a.getClass()));// ---->false } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }
package com.lxh.reflact; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.springframework.util.ReflectionUtils; /** * 使用反射工具类操作目标类方法 */ public class ReflectTest3 { @SuppressWarnings("rawtypes") public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException { Method m1 = ReflectionUtils.findMethod(A.class, "showMess"); m1.setAccessible(true); m1.invoke(A.class.newInstance(), new Object[]{}); Class arg[] = new Class[] { String.class };// 注意对有参函数调用的辅助参数 Method m2 = ReflectionUtils.findMethod(A.class, "showMess4", arg); m2.setAccessible(true); System.out.println(m2); m2.invoke(A.class.newInstance(), new String("lxh")); } }
标签:
原文地址:http://my.oschina.net/u/1989867/blog/528825