一、静态代理
接口类
public interface Person {
public void description();
}
目标类
public class SoftwareEngineer implements Person {
@Override
public void description() {
// TODO Auto-generated method stub
System.out.println("我是一个软件工程师,我从事Java开发工作几年了,我喜欢这份工作!");
}
}
代理类
public class Proxy1 implements Person {
private Person person;
@Override
public void description() {
// TODO Auto-generated method stub
System.out.println("下面有请一位工作人员为大家做介绍:");
person.description();
System.out.println("介绍结束,进入节目下一环节!");
}
public Proxy1(Person person) {
super();
this.person = person;
}
}
测试
public class ProxyTest1 {
public static void main(String[] args) {
System.out.println("直接访问真实实现类中的方法:");
Person person = new SoftwareEngineer();
person.description();
System.out.println("---------------------------------------------------");
System.out.println("通过代理实现类访问:");
Proxy1 proxy1 = new Proxy1(new SoftwareEngineer());
proxy1.description();
}
}
测试结果:
二、基于JDK的动态代理
接口类
public interface Student {
public void sing();
public void dance();
public void draw();
}
目标类
public class Jack implements Student {
@Override
public void sing() {
System.out.println("我最喜欢的歌曲是《那不勒的黎明》!");
}
@Override
public void dance() {
System.out.println("我喜欢古典舞!");
}
@Override
public void draw() {
System.out.println("我喜欢精美的魔幻题材的画作!");
}
}
代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
public static <T> Object getProxy(T t) {
Object newProxyInstance = Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("++++++++++++方法执行前+++++++++++");
Object obj = method.invoke(t, args);
System.out.println("************方法执行后****************");
return obj;
}
});
return newProxyInstance;
}
}
测试
public class ProxyTest2 {
public static void main(String[] args) {
System.out.println("直接访问真实实现类中的方法:");
Student stu = new Jack();
stu.sing();
stu.dance();
stu.draw();
System.out.println("---------------------------------------------------");
System.out.println("通过代理对象访问:");
Student proxy = (Student) ProxyFactory.getProxy(new Jack());
proxy.sing();
proxy.dance();
proxy.draw();
}
}
测试结果
三、基于Cglib的动态代理
目标类
public class Tom {
public void sing() {
System.out.println("我最喜欢的歌曲是《那不勒的黎明》!");
}
public void dance() {
System.out.println("我喜欢古典舞!");
}
public void draw() {
System.out.println("我喜欢精美的魔幻题材的画作!");
}
}
代理类
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class CglibFactory {
public static <T> Object getCglibProxy(T t) {
Enhancer en = new Enhancer();
en.setSuperclass(t.getClass());
en.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy)
throws Throwable {
System.out.println("++++++++++++方法执行前+++++++++++");
// Object invoke = methodProxy.invokeSuper(obj, args);
Object invoke = method.invoke(t, args);
System.out.println("************方法执行后****************");
return invoke;
}
});
Object proxyObj = en.create();
return proxyObj;
}
}
测试
public class ProxyTest3 {
public static void main(String[] args) {
System.out.println("直接访问真实实现类中的方法:");
Tom t = new Tom();
t.sing();
t.dance();
t.draw();
System.out.println("---------------------------------------------------");
System.out.println("通过代理对象访问:");
Tom proxy = (Tom) CglibFactory.getCglibProxy(new Tom());
proxy.sing();
proxy.dance();
proxy.draw();
}
}
测试结果