Использование Java-отражения - PullRequest
1 голос
/ 02 марта 2012

Я пытаюсь вызвать закрытый метод, принадлежащий одному классу, из другого класса, используя отражение Java. Оба эти класса принадлежат разным пакетам. Пример кода приведен ниже. Но каждый раз, когда я запускаю getDeclaredMethod, он возвращается с NoSuchMethodException. Как вызвать метод getCacheKey из моего класса?

Спасибо

Класс А

package com.abc;

public class TicketHelper
{
    static String getCacheKey(String ticketString, Ticket ticket) throws TicketException, UnsupportedEncodingException, NoSuchAlgorithmException {
      ...
    }
}

Класс B

package com.def;

...

private Method method = null;

public class TicketHelper
{
    ...

    try {
        method = TicketHelper.class.getDeclaredMethod("getCacheKey", new Class[] {String.class, Ticket.class});
        } catch (SecurityException e1) {
            setTrace("Security exception2 " + e1.getMessage());
        } catch (NoSuchMethodException e1) {
            setTrace("No such method exception2 " + e1.getMessage());
    }
    method.setAccessible(true);
    m_cacheKey = method.invoke(null, new Object[] {ticketString, ticket});
}

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Класс в com.def также называется TicketHelper?В этом случае вам необходимо квалифицироваться как com.abc.TicketHelper

РЕДАКТИРОВАТЬ

В опубликованном вами коде есть несколько ошибок компиляции. Всегда попробуйте привести короткий пример, который воспроизводит проблему;в большинстве случаев вы увидите ошибку в этом процессе.Следующее работает для меня.Это тот же пакет, но это не должно иметь значения:

public class TicketHelperUser
{
    public static void main(String[] args) throws Exception
    {
    for (java.lang.reflect.Method m : TicketHelper.class.getDeclaredMethods())
    {
        System.out.println(m);
    }
    java.lang.reflect.Method method = TicketHelper.class.getDeclaredMethod("getCacheKey", String.class, Ticket.class);
    method.setAccessible(true);
    method.invoke(null, new Object[] {"", new Ticket()});
    }
}

public class TicketHelper
{
    static String getCacheKey(String ticketString, Ticket ticket) 
    {
    return "cacheKey";
    }

}

public class Ticket {}
0 голосов
/ 02 марта 2012

Посмотрите: http://www.wikijava.org/wiki/Class_and_static_Method_Reflection_example

они используют getMethod вместо getDeclaredMethod

0 голосов
/ 02 марта 2012

Не решение, а тест для выявления проблемы: получите все объявленные методы и убедитесь, что getCacheKey виден / присутствует:

Method[] methods = TicketHelper.class.getDeclaredMethods();
for (Method method:methods) {
  if (method.getName().equals("getCacheKey")) {
    System.out.println(method);  // <-- breakpoint and inspect the method object
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...