静态代理
典型的实现: AspectJ 。
实现方式:一个接口,一个被代理类,一个代理类;两个类都要去实现这个接口,并且代理类要为被代理类增强方法。
/**
* 静态代理
*/
public class StaticProxy {
public static void main(String[] args) {
SellHouseImp sellHouseImp = new SellHouseImp();
SellHouseProxy sellHouseProxy = new SellHouseProxy(sellHouseImp);
sellHouseProxy.sell();
}
}
//接口
interface SellHouse{
void sell();
}
//被代理类
class SellHouseImp implements SellHouse{
@Override
public void sell() {
System.out.println("房东:卖出房子我能得到money");
}
}
//代理类
class SellHouseProxy implements SellHouse{
SellHouseImp sellHouseImp;
public SellHouseProxy(SellHouseImp sellHouseImp){
this.sellHouseImp = sellHouseImp;
}
@Override
public void sell() {
sellBefore();
sellHouseImp.sell();
sellAfter();
}
private void sellBefore(){
System.out.println("中介:卖之前需要给客户介绍房子");
}
private void sellAfter(){
System.out.println("中介:卖之后可以得到中介费");
}
}
动态代理
底层基于反射实现。
经典实现有:JDK的动态代理、CGLIB的动态代理;两者的区别主要是:JDK的动态代理依赖于被代理类必须要实现接口,而CGLIB的动态代理没有必须。
实现方式(以JDK的动态代理为例):一个接口,一个被代理类,一个代理类;
(1)被代理类实现这个接口,代理类实现 InvocationHandler 接口;
(2)代理类在重写的 invoke() 方法中去增强被代理类的方法;
(3)调用 Proxy 类的 newProxyInstance() 方法去创建代理对象,然后调用方法。
/**
* 动态代理
*/
public class DynamicProxy {
public static void main(String[] args) {
SellHouseImp2 sellHouseImp2 = new SellHouseImp2();
InvocationHandler invocationHandler = new SellHouseProxy2(sellHouseImp2);
SellHouse2 proxyInstance = (SellHouse2) Proxy.newProxyInstance(SellHouseImp2.class.getClassLoader(), SellHouseImp2.class.getInterfaces(), invocationHandler);
proxyInstance.sell();
}
}
//接口
interface SellHouse2{
void sell();
}
//被代理类
class SellHouseImp2 implements SellHouse2{
@Override
public void sell() {
System.out.println("房东:卖出房子我能得到money");
}
}
//代理类
class SellHouseProxy2 implements InvocationHandler {
SellHouseImp2 sellHouseImp2;
public SellHouseProxy2(SellHouseImp2 sellHouseImp2){
this.sellHouseImp2 = sellHouseImp2;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
sellBefore();
method.invoke(sellHouseImp2,args);
sellAfter();
return null;
}
private void sellBefore(){
System.out.println("中介:卖之前需要给客户介绍房子");
}
private void sellAfter(){
System.out.println("中介:卖之后可以得到中介费");
}
}