当前位置:首页 > IT技术 > 编程语言 > 正文

java动态代理实现demo
2021-10-20 10:26:50

1.创建接口:

/**
 * @author JingZhe  @time 2021/10/20 9:45
 */
public interface Person {
    /** 测试方法 */
    void doSomething();
}

2.创建接口的实现类:

/**
 * @author JingZhe  @time 2021/10/20 9:48
 */
public class JingZhe implements Person {

    @Override
    public void doSomething() {
        System.out.println("jingZhe doing Something");
    }
}

3.创建动态代理类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author JingZhe  @time 2021/10/20 9:44
 */
public class JDKDynamicProxy implements InvocationHandler {

    /** 声明被代理的对象 */
    private Person person;

    /** 构造函数 */
    public JDKDynamicProxy(Person person) {
        this.person = person;
    }

    /** 获取代理对象 */
    public Object getProxy() {
        Object proxyInstance = Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), this);
        return proxyInstance;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("对原方法进行了前置增强");
        // 原方法执行
        Object invoke = method.invoke(person, args);
        System.out.println("对原方法进行了后置增强");
        return invoke;
    }
}

4.编写测试类:

/**
 * @author JingZhe  @time 2021/10/20 9:46
 */
public class proxyTest {
    public static void main(String[] args) {

        System.out.println("不使用代理类,调用doSomething");
        Person person = new JingZhe();
        person.doSomething();

        System.out.println("--------------------------");

        System.out.println("使用代理类,调用doSomething");
        Person proxy = (Person) new JDKDynamicProxy(new JingZhe()).getProxy();
        proxy.doSomething();

    }
}

测试结果:

不使用代理类,调用doSomething
jingZhe doing Something
--------------------------
使用代理类,调用doSomething
对原方法进行了前置增强
jingZhe doing Something
对原方法进行了后置增强

以上。

本文摘自 :https://www.cnblogs.com/

开通会员,享受整站包年服务立即开通 >