为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
组成
- 抽象角色:声明真实角色实现的业务方法。
- 代理角色:代理真实角色,并且可以附加行为
- 真实角色:定义真实角色所要实现的业务逻辑,供代理角色调用。
静态代理
/**
* 静态代理
*/
public class Test {
public static void main(String[] args) {
new T01Proxy(new T01()).say();
}
/**
* 代理
*/
static class T01Proxy implements TInterFace{
private TInterFace t;
public T01Proxy(TInterFace t){
this.t = t;
}
@Override
public void say() {
System.out.println("前置处理");
t.say();
System.out.println("后置处理");
}
}
/**
* 被代理对象
*/
static class T01 implements TInterFace {
@Override
public void say() {
System.out.println("T01 say .......");
}
}
interface TInterFace {
void say();
}
}
JDK动态代理类示例
public class MyJdkInvocationHandler implements InvocationHandler {
//被代理对象
private Object target;
public void setTarget(Object target) {
this.target = target;
}
/**
*
* @param proxy 代理类对象
* @param method 被代理执行的方法
* @param args 目标方法参数
* @return 防止执行的返回值
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("日志收集中...");
Object result= method.invoke(target,args);
System.out.println("日志收集结束...");
return result;
}
public <T> T getProxy(){
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
}
public class TestMain {
public static void main(String[] args) {
MyJdkInvocationHandler proxy = new MyJdkInvocationHandler();
proxy.setTarget(new TestServiceImpl());
TestService testService = proxy.getProxy();
testService.read("小小孩");
testService.write("大男孩");
}
}
Cjlib动态代理类示例
public class TestMain {public class MyCjlibIProxy implements MethodInterceptor {
//被代理对象
private Object target;
public Object getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
// 设置回调方法
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
}
public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("日志收集中。。。");
Object result = proxy.invokeSuper(object, args);
System.out.println("日志收集结束。。。");
return result;
}
}
public class TestMain {
private static void testCjlibProxy(){
MyCjlibIProxy proxy = new MyCjlibIProxy();
TestService testService = (TestService)proxy.getInstance(new TestServiceImpl());
testService.read("小小孩");
testService.write("大男孩");
}
}
网友评论