我知道Java支持代理。我一直在检查Javassist,但不确定它是否可以支持以下技巧:
public class Hello {
public void hi() {
System.out.println("hi");
}
}
Hello hello = new Hello();
Hello proxyHello = createProxy(hello);
proxyHello.hi(); // method will be intercepted by a predefined proxy
有可能做这样的事情吗?
JDK中提供的功能仅允许创建实现一组接口的代理,如果您要创建的代理Class
,则需要使用,Javassist
但是要做到这一点,您需要一个可从该类访问的构造函数您在其中创建代理的位置。
这是一种实现您所需的方法:
final Hello hello = new Hello() {
public void hi() {
System.out.println("Hello World");
}
};
ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(Hello.class);
MethodHandler handler = (self, m, proceed, args) -> {
// This allows to proxy even non accessible methods, it could not be
// needed depending on your context
if (!m.isAccessible())
m.setAccessible(true);
return m.invoke(hello, args);
};
Hello proxy = (Hello)factory.create(new Class<?>[0], new Object[0], handler);
proxy.hi();
输出:
Hello World
在此示例中:
此处有更多详细信息
假设您有一个带一个String
参数的构造函数,则需要将最后一行修改为下一行:
Hello proxy = (Hello)factory.create(
new Class<?>[]{String.class}, new Object[]{"bar"}, handler
);
在这里,我使用一个类型为实参的构造函数进行调用,String
并将其bar
作为值提供。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句