动态代理

动态代理笔记

 

package proxy;

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

interface Subject{
	public void request();
}

/**
 * 真实角色
 * @author Administrator
 *
 */
class RealSubject implements Subject{

	@Override
	public void request() {
		System.out.println("Real Subject!");
	}
}

/**
 * 动态代理 
 * @author Administrator
 * 
 * 该代理类的内部属性是Object的,这样才能起到动态代理的作用
 * invoke方法中的method.invoke方法就是调用被代理对象的将要执行的方法,在本例中就是request()方法
 * 方法的参数是object,表示该方法为传入对象的方法。
 * 
 * 通过动态对象代理类,我们可以在执行真实对象的方法前后加入自己的一些方法,
 * 应用:Spring中的AOP,面向切面编程
 */
class DynamicSubject implements InvocationHandler{
	
	private Object object;
	
	public DynamicSubject(Object object){
		this.object = object;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("before");
		
		method.invoke(object,args);
		
		System.out.println("end");
		return null;
	}
	
}

public class ProxyTest {

	public static void main(String[] args) throws Exception{
		RealSubject realSubject = new RealSubject();
		InvocationHandler invocationHandler = new DynamicSubject(realSubject);
		
		Class<?> clazz = invocationHandler.getClass();
		
		//下面是两步实现, 生成代理
		//返回代理实例的Class对象。
		Class proxyClass = Proxy.getProxyClass(
				clazz.getClassLoader(),realSubject.getClass().getInterfaces()) ;
		
		//返回一个代理
		Subject subject2 = (Subject) proxyClass.getConstructor(
				InvocationHandler.class).newInstance(new Object[]{invocationHandler});
		subject2.request();
		
		
		//下面是一步实现,生成代理
		Subject subject1 = (Subject) Proxy.newProxyInstance(
				clazz.getClassLoader(),realSubject.getClass().getInterfaces(),invocationHandler);
		subject1.request();
	}
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值