Java Reflection (Java反射)实例

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. 得到某个对象的属性

  1. public Object getProperty(Object owner, String fieldName) throws Exception {      
  2.     Class ownerClass = owner.getClass();                                          
  3.                                                                                   
  4.     Field field = ownerClass.getField(fieldName);                                 
  5.                                                                                   
  6.     Object property = field.get(owner);                                           
  7.                                                                                   
  8.     return property;                                                              
  9. }                                                                                 

Class ownerClass = owner.getClass():得到该对象的Class。

Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。

Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。


3. 得到某个类的静态属性

  1. public Object getStaticProperty(String className, String fieldName)    
  2.             throws Exception {                                         
  3.     Class ownerClass = Class.forName(className);                       
  4.                                                                        
  5.     Field field = ownerClass.getField(fieldName);                      
  6.                                                                        
  7.     Object property = field.get(ownerClass.newInstance());                           
  8.                                                                        
  9.     return property;                                                   
  10. }                                                                      

Class ownerClass = Class.forName(className) :首先得到这个类的Class。

Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性,获得是公有字段。

Object property = field.get(ownerClass.newInstance()) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。


4.根据方法名来执行方法

	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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值