proxy代理
当我们某个功能需要加强的时候我们可以通过proxy代理来加强
案例:
步骤1:在com.hello.dao包下新建一个CarDao接口以及他的实现类CarDaoImpl,具体代码如下:
CarDao接口:
package com.hello.dao;
public interface CarDao {
public void play();
}
CarDaoImpl实现类:
package com.hello.dao;
public class CarDaoImpl implements CarDao {
@Override
public void play() {
System.out.print("我能跑120km/h");
}
}
我们现在有待加强的方法play(),等一下通过代理把它加强一下~
步骤2:新建一个com.hello.proxy包并在包下新建一个代理工具类ProxyUtils
package com.hello.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.hello.dao.CarDao;
public class ProxyUtils {
public static CarDao getPlayProxy(final CarDao cd){
// 直接 call 代理对象出来帮忙:Proxy
CarDao cdPlus=(CarDao) Proxy.newProxyInstance(cd.getClass().getClassLoader(), cd.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 接着,找到需要加强方法,就再把需要加强的东西写进去
if("play".equals(method.getName())) {
System.out.print("我能飞上天");
}
return method.invoke(cd, args);
}
});
return cdPlus; //把普通的一个对象传进来,返回一个加强后的对象
}
}
步骤3:然后就可以测试了,新建一个测试类TestClass
package com.hello.test;
import org.junit.Test;
import com.hello.dao.CarDao;
import com.hello.dao.CarDaoImpl;
import com.hello.proxy.ProxyUtils;
public class TestClass {
@Test
public void test(){
CarDao cd=new CarDaoImpl(); //new一个CarDaoImpl对象
System.out.print("我的初始技能:");
cd.play(); //先看看没有加强之前的内容
System.out.println();
System.out.print("我改装之后的技能:");
//把对象传进代理工具类加强,得到一个加强后的对象
CarDao udPlus = ProxyUtils.getPlayProxy(cd);
udPlus.play(); //再测试加强后的方法
}
}