码迷,mamicode.com
首页 > 编程语言 > 详细

Java:反射与代理

时间:2015-03-30 20:40:44      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

Java世界的繁荣反射这一特性有很大功劳,可以获取全面的类型信息。

/**
 * 
 */
package ref;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author hegaofeng
 *
 */
public class Invoker {

	/**
	 * @param args
	 * @throws SecurityException 
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 * @throws InvocationTargetException 
	 * @throws NoSuchMethodException 
	 */
	public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		// TODO Auto-generated method stub
		DatabaseOps ops = (DatabaseOps)Proxy.newProxyInstance(
				DbOpsWrap.class.getClassLoader(), 
				new Class[]{DatabaseOps.class}, 
				new DbOpsWrap(new DbOpsImpl()));
		ops.deleteUser(100);
		ops.listUser();
		
		ValueFields obj = new ValueFields();
		System.out.println(obj);
		
		
		Class<?> cv = ValueFields.class;
		Field a = cv.getDeclaredField("a");
		a.setAccessible(true);
		a.set(obj, 12345);
		System.out.println(obj);
		
		
		Method m = cv.getDeclaredMethod("show", null);
		m.setAccessible(true);
		m.invoke(obj, null);
	}

}

class DbOpsImpl implements DatabaseOps {

	@Override
	public void listUser() {
		System.out.println("user listed");
	}

	@Override
	public void deleteUser(int id) {
		// TODO Auto-generated method stub
		System.out.println("user:" + id + " deleted.");
	}
}

class ValueFields {
	private int a = 1;
	protected int b=2;
	public String c="name";
	
	
	private void show() {
		System.out.println("private method show");
	}
	
	@Override
	public String toString() {
		return "ValueFields [a=" + a + ", b=" + b + ", c=" + c + "]";
	}
}

class DbOpsWrap implements InvocationHandler {
	private DbOpsImpl proxied;
	
	public DbOpsWrap(DbOpsImpl impl) {
		proxied = impl;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		System.out.println(method.getName());
		return method.invoke(proxied, args);
	}
}

interface DatabaseOps{
	void listUser();
	void deleteUser(int id);
}

 

Class中的

getDeclaredXXX系列函数用于获取定义在该类本层的属性方法(不包括从基类继承得到的)

getXXX系列函数用于获取所有public的属性方法,包括从父类继承得到的,但不含private,protected等非public方法。

Java:反射与代理

标签:

原文地址:http://www.cnblogs.com/lailailai/p/4378926.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!