在Java中,代理是一种设计模式,它允许一个对象(代理)控制对另一个对象(真实对象)的访问。Java中的代理主要分为两种类型:JDK(Java Dynamic Proxy)代理和CGLIB(Code Generation Library)代理。
JDK 代理
JDK 代理是 Java 动态代理的一种实现方式,它是通过 Java 反射机制来实现的。JDK 代理要求被代理的类必须实现一个或多个接口,因为它是基于接口的代理。
使用步骤:
定义接口: 定义一个接口,它是被代理类和代理类都要实现的接口。
public interface MyInterface {
void doSomething();
}
实现真实对象类: 实现接口的真实对象类。
public class RealObject implements MyInterface {
public void doSomething() {
System.out.println("RealObject is doing something.");
}
}
创建代理对象: 使用 Proxy.newProxyInstance()
方法创建代理对象。
RealObject realObject=new RealObject();
MyInterface proxyInstance = (MyInterface) Proxy.newProxyInstance(RealObject.class.getClassLoader(), RealObject.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before invoking method.");
Object result = method.invoke(realObject, args);
System.out.println("After invoking method.");
return result;
}
});
proxyInstance.doSomething();
CGLIB 代理
CGLIB 代理是通过生成被代理类的子类来实现的,因此不要求被代理类实现接口,它可以代理没有无参构造函数的类。
创建代理对象: 使用 Enhancer
类创建代理对象。
RealObject realObject=new RealObject();
//代理是子类型,目标是父类型
RealObject proxy = (RealObject) Enhancer.create(RealObject.class, new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("Before invoking method.");
Object result = methodProxy.invokeSuper(o, args);
// Object invoke = methodProxy.invoke(realObject, args);
System.out.println("After invoking method.");
return result;
}
});
proxy.doSomething();
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/196943.html