Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。
例子:
1.给类的字段赋值(通过Method, 而不是field.set)
public static void getobj(Object obj,String[] fields,Object[] values) throws Exception{ Class cl=obj.getClass(); for (int i = 0; i < fields.length; i++) { String str="set"; Field fie=cl.getDeclaredField(fields[i]); String methodname=str+fields[i].substring(0, 1).toUpperCase()+fields[i].substring(1); System.out.println(methodname); Class partype=fie.getType(); System.out.println(partype); Method me=cl.getDeclaredMethod(methodname, partype); me.invoke(obj, values[i]); } } public static Object getobj1(String classname,Map<String, Object> k_v) throws Exception{ Class cl=Class.forName(classname); Object o=cl.newInstance(); Iterator<String> it=k_v.keySet().iterator(); Pattern pattern=Pattern.compile("^\\w"); while (it.hasNext()) { String pro=it.next(); // String ss="set"+pro.substring(0,1).toUpperCase()+pro.substring(1); Matcher mat=pattern.matcher(pro); String ss="set"; if(mat.find()){ ss+=mat.replaceFirst(mat.group(0).toUpperCase()); } cl.getMethod(ss, k_v.get(pro).getClass()).invoke(o, k_v.get(pro)); } return o; } public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub // T_user t=new T_user(); // getobj(t, new String[]{"age","name"},new Object[]{10,"zs"}); // System.out.println(t.getName()+" "+t.getAge()); Map map=new HashMap(); map.put("id",1); map.put("name", "ss"); T_user t1=(T_user)getobj1("org.hzy.dao.T_user", map); System.out.println(t1.getId()+" "+t1.getAge()+" "+t1.getName()); }
2. 得到某个对象的属性
Class ownerClass = owner.getClass():得到该对象的Class。
Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。
Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。
3. 得到某个类的静态属性
Class ownerClass = Class.forName(className) :首先得到这个类的Class。
Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性,获得是公有字段。
Object property = field.get(ownerClass.newInstance()) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。
public static Object printmethod(Object obj, String methodname, Object[] args) throws Exception { Class cl = obj.getClass(); // Method[] me=cl.getDeclaredMethods(); Method method = null; Class[] c = null; if (args != null) { c = new Class[args.length]; for (int i = 0; i < args.length; i++) { c[i] = args[i].getClass(); } } if (c == null) { method = cl.getMethod(methodname); } else { method = cl.getMethod(methodname, c); } return method.invoke(obj, args); }5.构造器Constructor
Constructor con=c.getConstructor(Integer.class,Integer.class,String.class);//编译时 和 运行时 T_user t2=(T_user)con.newInstance(1,2,"a"); System.out.println(t2.getName());*/ Constructor[] csts = c.getConstructors(); for (int i = 0; i < csts.length; i++) { System.out.println(csts[i].toString()); }
6.改变字段的值
public static void main(String args[]) { try { Class cls = Class.forName("field2"); Field fld = cls.getField("d"); field2 f2obj = new field2(); System.out.println("d = " + f2obj.d); fld.setDouble(f2obj, 12.34); System.out.println("d = " + f2obj.d); } catch (Throwable e) { System.err.println(e); } }
更多实例:
http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html