gpt4 book ai didi

java - 具有子类运行时类型的火灾事件

转载 作者:太空宇宙 更新时间:2023-11-04 08:33:34 24 4
gpt4 key购买 nike

我想在 CDI 中触发一个事件,我只能在运行时确定其类型。例如,假设有一些接口(interface) A与实现类AAAB 。我有两个观察者:

public void observeAA(@Observes AA aa) {
}

public void observeAA(@Observes AB ab) {
}

然后是一些事件生产者:

@Inject @Any
private Event<A> event;

public A getPayload();

public void fire() {
this.event.fire(getPayload());
}

这不起作用,因为 A既不是 AA 的子类型或AB (反之亦然)。我注意到有一个 select采用子类型的方法:

public <U extends T> Event<U> select(Class<U> subtype, Annotation... qualifiers);

但是,它需要正确参数化的 Class对象,(如果我错了,请纠正),我无法在运行时构建。

有什么解决方案吗?还是我必须使用限定符(可能是带有 Class<?> 方法的注释)?

最佳答案

我最终使用了带有 Class<?> 的限定符成员(member)。

@Qualifier
@Target({TYPE, METHOD, PARAMETER, FIELD})
@Retention(RUNTIME)
public @interface EventType {
Class<?> value();
}


public class Dispatcher {

@Inject @Any
private Event<A> event;

public void fireEvent(A a) {
this.event.select(
getTypeAnnotation(
a.getClass())).fire(a);
}

public static EventType getTypeAnnotation(
final Class<?> type) {
return (EventType) Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class<?>[]{EventType.class},
new InvocationHandler() {

@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
if (method.equals(
EventType.class.getMethod("value"))) {
return type;
} else if (method.equals(Annotation.class.getMethod(
"annotationType"))) {
return EventType.class;
} else if (method.getName().equals("hashCode")) {
return 127 * "value".hashCode() ^ type.hashCode();
} else if (method.getName().equals("equals")) {
return (args[0] instanceof EventType &&
((EventType)args[0]).value()
.equals(type));
}
return null;
}
});
}
}

public class X {
public void observeA(
@Observes @EventType(AA.class) A a) {
...

编辑

这是实例化注释的一种更简单的方法:

public abstract static class ConfigTypeAnnotation
extends AnnotationLiteral<ConfigType>
implements ConfigType { }

public static ConfigType getConfigTypeAnnotation(final Class<?> type) {
return new ConfigTypeAnnotation() {
@Override
public Class<?> value() {
return type;
}
};
}

关于java - 具有子类运行时类型的火灾事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6938796/

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