JDK动态代理初探
说明
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();
}
}
下一篇:CGLIB代理
本作品采用《CC 协议》,转载必须注明作者和本文链接