#java #methods #reflection #crash #concurrentmodification
#Ява #методы #отражение #авария #одновременная модификация
Вопрос:
Подводя итог своему проекту, я пытаюсь создать обработчик событий, который запускает методы из заданного списка методов. Чтобы вызвать эти методы, мне нужно передать новый экземпляр метода. Однако метод запускается правильно сразу после сбоя всей программы с «исключением ConcurrentModificationException».
@EventHandler private Listenerlt;EventKeyInputgt; eventKeyInput = new Listenerlt;gt;(event -gt; { for(Method m : event.getMethods()) { try { m.invoke(m.getDeclaringClass().newInstance(), event); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } });
Один из методов, который я хочу назвать
@EventAnnotation() public void eventKeyInputeTest(EventKeyInput event) { System.out.println("EventKeyInput test!"); }
Пожалуйста, дайте мне знать, если мне понадобится предоставить еще код. Спасибо вам за любую помощь!
Изменить: Добавлен класс, в котором я изменяю метод
Есть ли какой — нибудь другой способ сделать это?
for(Method m : listenable.getClass().getMethods()) { if(m.isAnnotationPresent(EventAnnotation.class)) { Parameter[] params = m.getParameters(); if(params.length != 1) { System.out.println("You need 1 event paramter!"); } Classlt;?gt; eventType= params[0].getType(); try { Object methods = eventType.getMethod("getMethods").invoke(eventType.newInstance(), null); Method add = List.class.getDeclaredMethod("add", Object.class); add.invoke(methods, m); eventType.getMethod("setMethods", ArrayList.class).invoke(eventType.newInstance(), methods); } catch (Exception e) { e.printStackTrace(); } } }
Комментарии:
1. Вы можете опубликовать сообщение об исключении и трассировку стека?
2. По-видимому, по крайней мере один из вызываемых вами методов рефлексивно изменяет коллекцию события. В любом случае, это странный дизайн, что событие предоставляет коллекцию
Method
объектов, которые слушатель вызывает в эфемерном экземпляре, не заботясь об их назначении. Поскольку дажеm.getDeclaringClass()
это связано сMethod
объектом, предоставленным событием, событие в конечном итоге решило, какой конкретный метод вызывать, но цель этого косвенного отражения неясна.