java.lang.illegalArgumentException при вызове pumpEvents с использованием отражения - PullRequest
0 голосов
/ 07 ноября 2011

Я пытаюсь создать модальный фрейм в Java-апплете, как показано здесь: http://www.java2s.com/Tutorial/Java/0240__Swing/Showthegivenframeasmodaltothespecifiedowner.htm. Этот код имеет функцию start (), которая выглядит как

public void start() throws Exception {
  Class<?> clazz = Class.forName("java.awt.Conditional");
  Object conditional = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] { clazz },
      this);
  Method pumpMethod = Class.forName("java.awt.EventDispatchThread").getDeclaredMethod(
      "pumpEvents", new Class[] { clazz });
  pumpMethod.setAccessible(true);
  pumpMethod.invoke(Thread.currentThread(), new Object[] { conditional });
}.

Когда я звоню

 pumpMethod.invoke(Thread.currentThread(), new Object[] { conditional });

У меня есть следующее исключение:

    java.lang.RuntimeException: java.lang.IllegalArgumentException: object is not an instance of declaring class
    at wizard.ModalFrameUtil.showAsModal(ModalFrameUtil.java:136)
    at wizard.WizardCore.showWizardFrame(WizardCore.java:206)
    at SelfRegistrationApplet$1.run(SelfRegistrationApplet.java:55)
    at SelfRegistrationApplet$1.run(SelfRegistrationApplet.java:35)
    at java.security.AccessController.doPrivileged(Native Method)
    at SelfRegistrationApplet.RunSelfRegistrationApplet(SelfRegistrationApplet.java:32)
    at SelfRegistrationApplet.init(SelfRegistrationApplet.java:26)
    at sun.applet.AppletPanel.run(AppletPanel.java:424)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at wizard.ModalFrameUtil$EventPump.start(ModalFrameUtil.java:80)
    at wizard.ModalFrameUtil.showAsModal(ModalFrameUtil.java:133)
    ... 8 more

Не могли бы вы рассказать, что не так в этом вызове и как избежать этого исключения?

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Это говорит о том, что объект Thread, возвращаемый Thread.currentThread(), не является экземпляром EventDispatchThread.

. Чтобы избежать проблемы, нужно выяснить, каков класс этого объекта.на самом деле, и использовать этот класс для получения объекта Method.(Вы должны быть в состоянии выяснить, что это такое, напечатав объект, полученный из Thread.currentThread().getClass() в том месте, где вы пытаетесь вызвать метод.


В Javadoc для invoke это говоритthis:

"Throws IllegalArgumentException - если метод является методом экземпляра, а указанный аргумент объекта не является экземпляром класса или интерфейса, объявляющим базовый метод (или его подкласс или реализатор)); если число фактических и формальных параметров различается, если преобразование развертывания для примитивных аргументов завершается неудачей или если после возможного развертывания значение параметра не может быть преобразовано в соответствующий тип формального параметра путем преобразования вызова метода. "

Мое чтение вашего кода таково, что у вас есть правильное число и тип фактических аргументов, поэтому это должно быть проблемой с классом потока.

0 голосов
/ 07 ноября 2011

AWT и Swing GUI являются однопоточными. Поток диспетчеризации событий - это специальный поток, в котором должны выполняться все операции GUI.Вероятно, ваш метод не вызывается в потоке графического интерфейса.Убедитесь, что вы вызываете свой метод в потоке диспетчеризации событий, вы можете сделать это, вызвав его следующим образом:

SwingUtilities.invokeAndWait(new Runnable(){public void run(){mymethod();}})

Примечание. Javadocs не содержат java.awt.EventDispatchThread, поэтому вы, вероятно, зависите от некоторых деталей реализации.Вместо этого вы можете использовать подкласс java.awt.EventQueue и Toolkit.getSystemEventQueue().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...