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