Java代理模式,
分享于 点击 20728 次 点评:68
Java代理模式,
本文将从以下几个方面进行阐述:
静态代理:
其类图如下:
真实角色与代理类同时实现一个接口,真实角色只处理与它核心业务相关的,其他的全部由代理角色完成。
/**
* 抽象接口
* @author sg
*/
public interface Subject {
void printBeforeLogging();
void operation();
void printAfterLogging();
}
//真实角色
public class RelSubject implements Subject{
@Override
public void printBeforeLogging() {
System.out.println("RelSubject printBeforeLogging");
}
@Override
public void operation() {
System.out.println("RelSubject operation");
}
@Override
public void printAfterLogging() {
System.out.println("RelSubject printAfterLogging");
}
}
//代理角色
public class Proxy implements Subject{
private Subject subject;
public Proxy(Subject subject) {
super();
this.subject = subject;
}
@Override
public void printBeforeLogging() {
System.out.println("Proxy printBeforeLogging");
}
@Override
public void operation() {
//真实的角色来完成
subject.operation();
}
@Override
public void printAfterLogging() {
System.out.println("Proxy printAfterLogging");
}
}
//客户端代码
public class Client {
public static void main(String[] args) {
Subject subject=new RelSubject();
Subject proxy=new Proxy(subject);
proxy.printBeforeLogging();
proxy.operation();
proxy.printAfterLogging();
}
}
Proxy printBeforeLogging
RelSubject operation
Proxy printAfterLogging
动态代理
public interface Calculate {
void operate();
}
public class CalculateImpl implements Calculate{
@Override
public void operate() {
System.out.println("Operating");
}
}
//代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxy implements InvocationHandler{
//目标对象
private Object target;
public DynamicProxy(Object target){
this.target= target;
}
public Object getProxy(){
//调用Proxy的静态方法
return
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(target, args);
return result;
}
}
//客户端
public class Client {
public static void main(String[] args) {
Calculate target=new CalculateImpl();
Calculate proxy = (Calculate)new DynamicProxy(target).getProxy();
proxy.operate();
}
}
cglib代理实现
首先下载所必须Jar包:cglib
public class CglibProxyFactory implements MethodInterceptor {
private Object target;
public CglibProxyFactory(Object target) {
super();
this.target = target;
}
public Object myCglibLogging() {
Enhancer enhancer = new Enhancer();
// 生成得代理类对象为该类的子类
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 调用动态方法的时候会调用此方法
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Object result = method.invoke(target, args);
System.out.println(method);
return result;
}
}
//测试
public class CglibProxyTest {
public static void main(String[] args) {
CglibProxyTest ct=new CglibProxyTest();
CglibProxyTest myCglibLogging = (CglibProxyTest) new CglibProxyFactory(ct).myCglibLogging();
myCglibLogging.run();
}
public void run(){
System.out.println("running");
}
}
总结:
基于接口的代理方式的缺点为所要代理的应该实现接口,而基于cglib的代理如果定义为final也是无法实现的了。
更多相关文章可参考:
JDK动态代理实现原理详细分析
相关文章
- 暂无相关文章
用户点评