JDK 动态代理

用的是Proxy.newInstance(ClassLoader  loader,Class<?>[ ] interfaces,InvocationHandler  h)   返回的是Object,

实际是 interfaces 中的所有接口的一个实现类。我们把这个返回的对象,称为代理对象。

 

interface Dog {
	void info();
	void run(int speed);
}
class Gundog implements Dog {

	@Override
	public void info() {
		// TODO Auto-generated method stub
		System.out.println("我是一只猎狗");
	}

	@Override
	public void run(int speed) {
		// TODO Auto-generated method stub
		System.out.println("我奔跑迅速,时速已达:" + speed + "公里/小时");
	}
}
//相当于:  	通用的拦截器
class DogUtil {
	void method1() {
		System.out.println("模拟第一个通用方法");
	}
	void method2() {
		System.out.println("模拟通用方法二");
	}
}
class MyInHandler implements InvocationHandler {
	private Object target;// 需要被代理的对象
	public void setTarget(Object tar) {
		this.target = tar;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		DogUtil du = new DogUtil();
		du.method1();//用一个通用方法
		Object result = method.invoke(target, args);//被代理的对象的方法
		du.method2();//再用一个
		return result;
	}
}
class MyProxyFactory {
	public static Object getProxy(Object target) {
		MyInHandler handler = new MyInHandler();
		handler.setTarget(target);
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), 
					target.getClass().getInterfaces(), handler);
	}
}
public class DynamicProxyDog {
	public static void main(String[] args) {
		Dog target = new Gundog();
		Dog dog = (Dog) MyProxyFactory.getProxy(target);
		System.out.println("1:");
		dog.info();
		System.out.println("\n2:");
		dog.run(100);

	        /*
		 * 换一种写法:使用生成的代理对象,反射其方法,并invoke
		 */
		System.out.println("");
		System.out.println("3:");
		Method infoM = dog.getClass().getMethod("info", null);
		infoM.invoke(dog, null);
		System.out.println("\n4:");
		Method runM = dog.getClass().getMethod("run", int.class);
		runM.invoke(dog, 80);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值