Ada*_*ter 80 java dynamic-proxy
根据文件:
[
java.lang.reflect.
]Proxy
提供了用于创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类.
该newProxyMethod
方法(负责生成动态代理)具有以下签名:
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
Run Code Online (Sandbox Code Playgroud)
不幸的是,这可以防止生成扩展特定抽象类的动态代理(而不是实现特定的接口).这是有道理的,考虑到java.lang.reflect.Proxy
"所有动态代理的超类",从而阻止另一个类成为超类.
因此,是否有任何替代方法java.lang.reflect.Proxy
可以生成从特定抽象类继承的动态代理,将对抽象方法的所有调用重定向到调用处理程序?
例如,假设我有一个抽象类Dog
:
public abstract class Dog {
public void bark() {
System.out.println("Woof!");
}
public abstract void fetch();
}
Run Code Online (Sandbox Code Playgroud)
是否有一个课程允许我做以下事情?
Dog dog = SomeOtherProxy.newProxyInstance(classLoader, Dog.class, h);
dog.fetch(); // Will be handled by the invocation handler
dog.bark(); // Will NOT be handled by the invocation handler
Run Code Online (Sandbox Code Playgroud)
axt*_*avt 111
可以使用Javassist(请参阅参考资料ProxyFactory
)或CGLIB来完成.
Adam使用Javassist的例子:
我(Adam Paynter)使用Javassist编写了这段代码:
ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(Dog.class);
factory.setFilter(
new MethodFilter() {
@Override
public boolean isHandled(Method method) {
return Modifier.isAbstract(method.getModifiers());
}
}
);
MethodHandler handler = new MethodHandler() {
@Override
public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
System.out.println("Handling " + thisMethod + " via the method handler");
return null;
}
};
Dog dog = (Dog) factory.create(new Class<?>[0], new Object[0], handler);
dog.bark();
dog.fetch();
Run Code Online (Sandbox Code Playgroud)
哪个产生这个输出:
Woof! Handling public abstract void mock.Dog.fetch() via the method handler
归档时间: |
|
查看次数: |
40649 次 |
最近记录: |