静态代理
public interface Subject {
void dealTask(String taskName);
}
public class RealSubject implements Subject {
@Override
public void dealTask(String taskName) {
System.out.println("Running Task:" + taskName);
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ProxySubject implements Subject {
private Subject delegate;
public ProxySubject(Subject delegate) {
this.delegate = delegate;
}
@Override
public void dealTask(String taskName) {
long startTime = System.currentTimeMillis();
delegate.dealTask(taskName);
long endTime = System.currentTimeMillis();
System.out.println("Running time:" + (endTime - startTime) + " timeMills");
}
}
public class SubjectStaticFactory {
public static Subject getInstance(){
return new ProxySubject(new RealSubject());
}
}
public class Client {
public static void main(String[] args) {
Subject proxy=SubjectStaticFactory.getInstance();
proxy.dealTask("DBQuery by static proxy");
}
}
动态代理
public class SubjectInvocationHandler implements InvocationHandler {
private Object delegate;
public SubjectInvocationHandler(Object delegate) {
this.delegate = delegate;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long startTime = System.currentTimeMillis();
method.invoke(delegate, args);
long endTime = System.currentTimeMillis();
System.out.println("Running time:" + (endTime - startTime) + " timeMills");
return null;
}
}
public class DynProxyFactory {
public static Subject getInstance() {
Subject delegate = new RealSubject();
InvocationHandler handler = new SubjectInvocationHandler(delegate);
Subject proxy = null;
proxy = (Subject) Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(), handler);
return proxy;
}
}
public class Client {
public static void main(String[] args) {
Subject proxy=DynProxyFactory.getInstance();
proxy.dealTask("DBQuery by dynamic proxy");
}
}
cglib代理
public class CgProxyFactory implements MethodInterceptor {
private Object target;
public CgProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance() {
Enhancer en = new Enhancer();
en.setSuperclass(target.getClass());
en.setCallback(this);
return en.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
long startTime = System.currentTimeMillis();
method.invoke(target, objects);
long endTime = System.currentTimeMillis();
System.out.println("Running time:" + (endTime - startTime) + " timeMills");
return null;
}
}
public class Client {
public static void main(String[] args) {
Subject target = new RealSubject();
RealSubject proxy= (RealSubject) new CgProxyFactory(target).getProxyInstance();
proxy.dealTask("DBQuery by cglib proxy");
}
}