1、JDK 代理方式 -- HelloService.java
package com.sample.modules.jdk;
public interface HelloService {
void sayHello();
}
2、JDK 代理方式 -- HelloServiceImpl.java
package com.sample.modules.jdk;
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("hello world!");
}
}
3、JDK 代理方式 -- ProxyHandler.java
package com.sample.modules.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler{
private Object subject;
public ProxyHandler(Object subject){
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
method.invoke(subject, args);
System.out.println("after");
return null;
}
}
4、JDK 代理方式 -- ProxyTest.java
package com.sample.modules.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
//1.被代理类
HelloServiceImpl helloService = new HelloServiceImpl();
//2.执行器
InvocationHandler handler = new ProxyHandler(helloService);
//3.代理类
HelloService helloInterface = (HelloService) Proxy.newProxyInstance(handler.getClass().getClassLoader(), helloService.getClass().getInterfaces(), handler);
helloInterface.sayHello();
}
}
5、Cglib 代理方式 -- HelloService.java
package com.sample.modules.cglib;
public class HelloService {
public void sayHello() {
System.out.println("hello world!");
}
}
6、Cglib 代理方式 -- ProxyHandler.java
package com.sample.modules.cglib;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class ProxyHandler implements MethodInterceptor {
@Override
public Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("======插入前置通知======");
Object object = methodProxy.invokeSuper(sub, objects);
System.out.println("======插入后者通知======");
return object;
}
}
7、Cglib 代理方式 -- ProxyTest.java
package com.sample.modules.cglib;
import net.sf.cglib.proxy.Enhancer;
public class ProxyTest {
public static void main(String[] args) {
// 通过CGLIB动态代理获取代理对象的过程
Enhancer enhancer = new Enhancer();
// 设置enhancer对象的父类
enhancer.setSuperclass(HelloService.class);
// 设置enhancer的回调对象
enhancer.setCallback(new ProxyHandler());
// 创建代理对象
HelloService proxy = (HelloService) enhancer.create();
// 通过代理对象调用目标方法
proxy.sayHello();
}
}