java动态代理实现demo

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
对原方法进行了后置增强

以上。

上一篇:AutoFac(五)——通过lambda表达式灵活注册


下一篇:do{...}while(0)的意义和用法