1、动态代理
运行时动态地对某些内容代理它做其他的事情。
2、接口
public interface Saying {
public void say(String name);
public void talk(String name);
}
public class SayingImpl implements Saying {
public void say(String name) {
System.out.println(name + ":大家好!");
}
public void talk(String name) {
System.out.println(name + ":始终贯彻社会主义核心价值观!");
}
}
3、cglib
public class CglibProxy implements MethodInterceptor {
Enhancer enhancer = new Enhancer();
public Object getProxy(Class<?> clazz) {
// 设置需要创建的子类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
// 通过字节码技术动态创建子类实例
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// 目标方法执行前
System.out.println("-----cglib-----");
System.out.println("-----准备-----");
// 目标方法调用
Object result = proxy.invokeSuper(obj, args);
// 目标方法执行后
System.out.println("-----结束-----");
return result;
}
}
public class CglibProxyTest {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
//通过动态代理生成子类的方式创建代理类
Saying target = (Saying) proxy.getProxy(SayingImpl.class);
target.say("张三");
target.talk("李四");;
}
}
4、javassist
public class JavassistProxy {
@SuppressWarnings({ "deprecation", "rawtypes" })
public Object getProxy(Class clazz) throws InstantiationException, IllegalAccessException {
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setSuperclass(clazz);
proxyFactory.setHandler(new MethodHandler() {
public Object invoke(Object self, Method thismethod, Method proceed, Object[] args) throws Throwable {
System.out.println("-----javassist-----");
System.out.println("-----方法调用前-----");
Object result = proceed.invoke(self, args);
System.out.println("-----方法调用后-----");
return result;
}
});
// 通过字节码技术动态创建子类实例
return proxyFactory.createClass().newInstance();
}
}
public class JavassistProxyTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
JavassistProxy javassistProxy = new JavassistProxy();
SayingImpl sayingImpl = (SayingImpl) javassistProxy.getProxy(SayingImpl.class);
sayingImpl.say("张三");
sayingImpl.talk("李四");
}
}
5、jdk
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 目标方法执行前
System.out.println("-----JDK-----");
System.out.println("-----准备-----");
// 目标方法调用
Object object = method.invoke(target, args);
// 目标方法执行后
System.out.println("-----结束-----");
return object;
}
}
public class JDKProxyTest {
public static void main(String[] args) {
// 被代理的业务类
Saying target = new SayingImpl();
// 将目标类与横切类编织在一起
MyInvocationHandler handler = new MyInvocationHandler(target);
// 创建代理实例
Saying proxy = (Saying) Proxy.newProxyInstance(
target.getClass().getClassLoader(), // 目标类加载器
target.getClass().getInterfaces(), // 目标类接口
handler);
//横切类
proxy.say("张三");
proxy.talk("李四");
}
}