- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试为我的 OpenGL 游戏引擎实现基于注释的事件系统。我在我想要这样调用的方法上应用 @EventListener 注解:
@EventListener(type = Type.COLLISION)
public void OnCollision(CollisionEvent data)
{
System.out.println("HI");
}
该方法所在的类实现了一个空接口(interface):
public class Sprite implements EventHandler
EventDispatcher 类:
public class EventDispatcher
{
private static List<EventHandler> registered = new ArrayList<EventHandler>();
public static void register(EventHandler EventHandler)
{
if (!registered.contains(EventHandler))
{
registered.add(EventHandler);
}
}
public static void unregister(EventHandler EventHandler)
{
if (registered.contains(EventHandler))
{
registered.remove(EventHandler);
}
}
public static List<EventHandler> getRegistered()
{
return registered;
}
public static void dispatch(final Event event)
{
new Thread()
{
@Override
public void run()
{
call(event);
}
}.start();
}
private static void call(final Event event)
{
for (EventHandler registered : getRegistered())
{
Method[] methods = registered.getClass().getMethods();
for (int i = 0; i < methods.length; i++)
{
System.out.println("Annotation Being Checked");
if (methods[i].isAnnotationPresent(EventListener.class))
{
System.out.println("Has Annotation");
Class<?>[] methodParams = methods[i].getParameterTypes();
if (methodParams.length < 1)
{
continue;
}
if (!event.getClass().getSimpleName().equals(methodParams[0].getSimpleName()))
{
continue;
}
try
{
methods[i].invoke(registered.getClass().newInstance(), event);
} catch (Exception exception)
{
System.err.println(exception);
}
} else System.out.println("No Annotation");
}
}
}
}
但是当我运行程序时,它总是打印出来
正在检查注释
无注释
多次。
有人可以帮忙吗?如果需要更多信息,请询问,我将编辑问题。
最佳答案
我根据您的示例设置了一个项目,并且运行良好。然而,当您的代码评估 Sprite
事件处理程序的所有方法时,您会看到一些“无注释”消息。即使您没有实现除 OnCollision
之外的任何其他方法,每个类也会从 Object 继承默认方法,例如 equals
、hashCode
或 toString
。
测试类:
public class SpriteTest {
public static void main(String[] args) {
EventDispatcher.register(new Sprite());
CollisionEvent collisionEvent = new CollisionEvent();
EventDispatcher.dispatch(collisionEvent);
}
}
除此之外,您的代码中还存在一些明显的缺陷:
EventHandler
的实例,但仅使用类信息并动态创建新实例 - 为什么不直接注册类而不是实例Class.isAssignableFrom
CollisionEventHandler
来代替通用的 EventHandler
等等...粗略的实现思路
public interface CollisionEventHandler extends EventHandler {
void onCollision(CollisionEvent event);
}
public class Sprite implements CollisionEventHandler {
public void onCollision(CollisionEvent data) {
System.out.println("HI");
}
}
public class EventDispatcher {
...
static void call(final CollisionEvent event) {
getRegistered().stream()
.filter(handler -> handler instanceof CollisionEventHandler)
.map(handler -> (CollisionEventHandler) handler)
.forEach(handler -> handler.onCollision(event));
}
}
要处理不同类型的事件,您将需要不同的调用/调度方法。也许你可以使用 Visitor pattern (虽然我不喜欢它)。
关于java - 为什么即使注释有 RetentionPolicy.RUNTIME,我的 isAnnotationPresent 方法也不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58678031/
RetentionPolicy.CLASS 和 RetentionPolicy.SOURCE 的预期需求是什么。在哪些注解场景中,我们可以使用这些?我想要一些例子。 从 Java 文档: CLASS:
这段代码中这些java.lang.annotation导入的目的是什么?为什么需要它们来定义 MyAnnotation? import java.lang.annotation.Documented;
RetentionPolicy.CLASS 和 RetentionPolicy.RUNTIME 的实际区别是什么? 看起来两者都记录在字节码中,并且无论如何都可以在运行时访问。 最佳答案 both m
我试图在 Spring RestController 中查找使用给定注释进行注释的方法。为了查看该 RestController 的方法上存在哪些注释,我执行了以下操作: Map beans = ap
有没有办法配置 ClassLoader 或 JVM 以使用 CLASS 保留策略加载注释,以便我可以使用反射访问它们? 这对于编译时后处理很有用,如前所述 here .我注释了我的一些类,以便自动生成
根据 Java Annotation API: RetentionPolicy.CLASS Annotations are to be recorded in the class file by th
我正在使用位于 Android 支持注释库中的 @VisibleForTesting 注释,它看起来像这样: @Retention(SOURCE) public @interface VisibleF
我正在尝试为我的 OpenGL 游戏引擎实现基于注释的事件系统。我在我想要这样调用的方法上应用 @EventListener 注解: @EventListener(type = Type.COLLIS
为什么在运行时有人对知道某个方法已被弃用感兴趣?有人能给我提供一些例子吗? 最佳答案 有一些框架和工具可以实例化对象以使用它们。 例如,许多 JavaBean UI 编辑器创建 bean 的实例并在用
是否可以(以任何方式)在 Maven Mojo 中使用 RetentionPolicy.SOURCE(或至少 RetentionPolicy.COMPILE)处理注释? 我想根据我的自定义注释和上述保
所以我试图为创建一个别名 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface ApiRe
在我使用 maven-dependency-plugin 检测未使用的依赖项的 mvn 项目中,似乎没有依赖项 scope 我可以为 Google 的 AutoValue 指定(com.google.
我是一名优秀的程序员,十分优秀!