Java Отражает newInstance (), вызывающий исключение ConcurrentModificationException (CME), приводящее к сбою

#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 объектом, предоставленным событием, событие в конечном итоге решило, какой конкретный метод вызывать, но цель этого косвенного отражения неясна.