Java代理示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 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");
    }
}

猜你喜欢

转载自blog.csdn.net/Zen99T/article/details/89048093