版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Zen99T/article/details/89048093
1 接口及其实现
public interface Greeting {
void sayHello(String name);
}
---------------------------------------------
public class GreetingImpl implements Greeting {
@Override
public void sayHello(String name) {
System.out.println( "Hello! " + name );
}
}
---------------------------------------------
public class MainProxy {
public static void main(String[] args) {
// staitcProxy();
jdkDynamicProxy();
// cglibDynamicProxy();
}
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");
}
}
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;
// 1. 首先实现一个InvocationHandler,方法调用会被转发到该类的invoke()方法。
public class JDKDynamicProxy implements InvocationHandler {
// 目标对象
private Object target;
public JDKDynamicProxy(Object target){
this.target = target;
}
// 2. 然后在需要使用Hello的时候,通过JDK动态代理获取Hello的代理对象。
@SuppressWarnings("unchecked")
public <T>T getProxy() {
// 会返回一个实现了指定接口的代理对象,对该对象的所有方法调用都会转发给InvocationHandler.invoke()方法
return (T) Proxy.newProxyInstance(
target.getClass().getClassLoader(), // 指定代理对象的类加载器;
target.getClass().getInterfaces(), // 代理对象需要实现的接口,可以同时指定多个接口
this // 自定义的InvocationHandler,即方法调用的实际处理者,代理对象的方法调用都会转发到这里
);
}
@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");
}
}