1 接口及其实现
public interface Greeting {
void sayHello(String name);
}
---------------------------------------------
public class GreetingImpl implements Greeting {
@Override
public void sayHello(String name) {
System.out.println( "Hello! " + name );
}
}
2 静态代理
public class GreetingProxy implements Greeting {
private GreetingImpl greeting;
public GreetingProxy(GreetingImpl greeting){
this.greeting = greeting;
}
@Override
public void sayHello(String name) {
before();
greeting.sayHello(name);
after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
3 JDK动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKDynamicProxy implements InvocationHandler {
private Object target;
public JDKDynamicProxy(Object target){
this.target = target;
}
@SuppressWarnings("unchecked")
public <T>T getProxy() {
return (T) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target,args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
4 CGLIB动态代理
4.1 pom.xml
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
4.2 Java实现
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CGLibDynamicProxy implements MethodInterceptor {
private static CGLibDynamicProxy instance = new CGLibDynamicProxy();
private CGLibDynamicProxy(){}
public static CGLibDynamicProxy getInstance(){
return instance;
}
@SuppressWarnings("unchecked")
public <T>T getProxy(Class<T> cls) {
return (T) Enhancer.create(cls,this);
}
@Override
public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
before();
Object result = proxy.invokeSuper(target,args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
5 测试代码
public class MainProxy {
public static void main(String[] args) {
jdkDynamicProxy();
}
private static void staitcProxy(){
Greeting greeting = new GreetingProxy(new GreetingImpl());
greeting.sayHello("jtzen9");
}
private static void jdkDynamicProxy(){
JDKDynamicProxy jdkDynamicProxy = new JDKDynamicProxy(new GreetingImpl());
Greeting greeting = jdkDynamicProxy.getProxy();
greeting.sayHello("jtzen9");
}
private static void cglibDynamicProxy(){
Greeting greeting = CGLibDynamicProxy.getInstance().getProxy(GreetingImpl.class);
greeting.sayHello("jtzen9");
}
}