JDK动态代理初探

说明

JDK 动态代理是在运行时生成 代理类 , 代理类现实类 实现了同一个接口,在调用具体的业务方法时,代理类 会转发到 调用类 (InvocationHandler) 的 invoke 方法中, invoke 方法需要自行实现。

Java动态代理初探

Code demo

业务接口:


public interface IUserQueryService {

    public Integer update();

    public String queryUserName();

}

现实类


public class UserQueryImpl implements IUserQueryService {

    @Override
    public Integer update() {
        log.info("更新用户操作");
        return null;
    }

    @Override
    public String queryUserName() {
        log.info("查询用户操作");
        return null;
    }

}

调用类

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

@Slf4j
public class LogHandler implements InvocationHandler {

    Object actualClass;

    public LogHandler(Object actualClass) {
        this.actualClass = actualClass;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this.before(actualClass, method, args);
        Object result = method.invoke(actualClass, args);
        this.after(actualClass, method, args);
        return result;
    }

    public void before(Object actualClass, Method method, Object[] args) {
        log.info("before run :class={} method={} args={}", actualClass.getClass(), method.getName(), args);
    }

    public void after(Object actualClass, Method method, Object[] args) {
        log.info("after run :class={} method={} args={}", actualClass.getClass(), method.getName(), args);

    }

}

代理类创建:

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

public class DynamicProxy {

    public static Object make(Object actualClass, InvocationHandler invocationHandler) {
        ClassLoader classLoader = actualClass.getClass().getClassLoader();
        Class<?>[] interfaces = actualClass.getClass().getInterfaces();

        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }

}

调用:


public class Test{

    public void main(){
        UserQueryImpl userQuery = new UserQueryImpl();
        LogHandler logHandler = new LogHandler(userQuery);
        IUserQueryService proxy = (IUserQueryService) DynamicProxy.make(userQuery, logHandler);

        proxy.queryUserName();
        proxy.update();
    }

}

下一篇:CGLIB代理

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!