說明
JDK 動態代理是在執行時生成
代理類
,代理類
與現實類
實現了同一個介面,在呼叫具體的業務方法時,代理類
會轉發到呼叫類
(InvocationHandler) 的invoke
方法中,invoke
方法需要自行實現。
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 協議》,轉載必須註明作者和本文連結