大白话 java动态代理——秒懂系列

 

代理模式分为动态代理和静态代理,重点是动态代理

什么叫做代理?

首先要有一个接口,定义了我们的服务(标准)

然后是一个实现类(继承上面那个接口)

还有有一个代理类也会去实现这个那个接口。

然后重点: 代理就是我们不能直接去访问这个实现类,只能通过代理类去访问实现类,先说一下这个访问是通过invoke这个方法实现,参数有 实例对象、方法对象、参数列表。

大概就是下面这个样子 public Object invoke(Object proxy, Method method, Object[] arg2)

如果完全按照上面那个意思来,那就是一个静态代理了。

什么就是动态代理呢,别懵,看我。

其实就是你什么时候来访问 代理类都让你访问并且只有同一个对象代理,这是静态,没有做任何的处理

动态代理就是每次访问实现类的时候每次都派一个对象去访问。所以这里面就有一个调度器proxy

然后动态代理做了预处理、过滤、服务后等操作。也就是说每次调用实例类都不是那么简单,我们需要对调用的对象做处理,就是上面那些处理。

这些处理是一个类做的。InvocationHander();

两个就构成动态代理

这里看一下代理

接口:

public interface Person {
	
	/**
	 * 这里定义一个借口,就是person,里面有一个方法:dosomething
	 */
	public void dosomething();
	
}

 

 

子类,我们的实现类,真正被调用的方法

/**
 * @author JZWen
 *	女人实现方法
 */
public class Woman  implements Person{

	@Override
	public void dosomething() {
		// TODO Auto-generated method stub
		System.out.println("我是女人,我爱美");
	}
	

}

 

代理类,重点

/**
 * @author JZWen
 *
 */
public class WomanProxy implements InvocationHandler{

	private Person person;
		
	public WomanProxy(Person person) {
		// TODO Auto-generated constructor stub
		super();
		this.person = person;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		donsomethingBefore();
		
		//这不就是反射吗。通过method对象去调用方法。前面是对象,后面是参数
		Object ret = method.invoke(proxy, args);
		
		dosomethingAfter();
		return ret;   
	}
	
	public void donsomethingBefore() {
		System.out.println("前前前前前前前前前前前前前");
	}
	
	public void dosomethingAfter() {
		System.out.println("后后后后后后后后后后后后后");
	}
	
	
	/**
	 * 这就是获取一个代理对象 ,解释一下那个this就是那个实现的InvocationHandler。
	 * @return
	 */
	public Object getProxyInstance() {
		return Proxy.newProxyInstance(person.getClass().getClassLoader() , person.getClass().getInterfaces() , this);	
	}
	
}

 

测试类:

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person person = new Woman();
	
		WomanProxy womanProxy = new WomanProxy(person);
		
		//在代理类找到一个人帮忙代理,然后这个代理就像是这个(披着person外套的WomanProxy)
		Person person2= (Person)womanProxy.getProxyInstance();
		
		person2.dosomething();
		
		//看到没有 穿进去的person和出来调用dosomething方法的对象不是同一个
		
	}

}

 

 

我觉得玄乎的地方在做

getProxyInstance(); 这个方法,他到底做了什么。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值