JDK動態代理初探

minororange 發表於 2021-09-18

說明

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();
    }

}
本作品採用《CC 協議》,轉載必須註明作者和本文連結