gpt4 book ai didi

java - 用于创建抽象类(而不是接口(interface))代理的 java.lang.reflect.Proxy 的替代品

转载 作者:IT老高 更新时间:2023-10-28 11:47:06 32 4
gpt4 key购买 nike

根据the documentation :

[java.lang.reflect.]Proxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by those methods.

newProxyMethod method (负责生成动态代理)具有以下签名:

public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException

不幸的是,这会阻止生成一个动态代理来扩展一个特定的抽象类(而不是实现特定的接口(interface))。这是有道理的,考虑到 java.lang.reflect.Proxy 是“所有动态代理的父类(super class)”,从而防止另一个类成为父类(super class)。

因此,是否有任何替代 java.lang.reflect.Proxy 可以生成从特定抽象类继承的动态代理,将所有调用重定向到 <调用处理程序的strong>抽象方法?

例如,假设我有一个抽象类Dog:

public abstract class Dog {

public void bark() {
System.out.println("Woof!");
}

public abstract void fetch();

}

有没有一门课可以让我做以下事情?

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

最佳答案

可以使用 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();

产生这个输出:

Woof!Handling public abstract void mock.Dog.fetch() via the method handler

关于java - 用于创建抽象类(而不是接口(interface))代理的 java.lang.reflect.Proxy 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3291637/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com