Как получить доступ к статическому методу через ссылку на класс - PullRequest
21 голосов
/ 05 марта 2011
class A {
    public static void foo() {}
}

class B {
    public static void foo() {}
}

У меня Class clazz = A.class; or B.class;

Как я могу получить к нему доступ через «clazz», если предположить, что ему может быть назначено «A» или «B»

Ответы [ 5 ]

32 голосов
/ 05 марта 2011

Доступ к этим методам возможен только с помощью отражения. Вы не можете ссылаться на класс напрямую, только на экземпляр типа Class.

Чтобы использовать отражение для вызова метода name (int a, String b):

Method m = clazz.getMethod("methodname", Integer.class, String.class);
m.invoke(null, 1, "Hello World!");

См. Class.getMethod () и Method.invoke ()

Возможно, вы захотите снова подумать о своем дизайне, чтобы избежать необходимости динамического вызова статических методов.

10 голосов
/ 05 марта 2011

Вы можете вызвать статический метод с помощью отражения следующим образом:

Method method = clazz.getMethod("methodname", argstype);
Object o = method.invoke(null, args);

Где argstype - это массив типов аргументов, а args - это массив параметров для вызова. Больше информации по следующим ссылкам:

В вашем случае что-то вроде этого должно работать:

Method method = clazz.getMethod("foo", null);
method.invoke(null, null); // foo returns nothing
5 голосов
/ 05 марта 2011

Вы не можете получить доступ к статическим методам без явной ссылки на класс.

Здесь нет наследования, извините, поэтому вы должны либо сделать:

Если вам это действительно нужно, вам нужно будет проверить:

Object o = .... // eith an A or B instance.
if( o instanceof A ) {
    A.foo()
} else {
    B.foo()
}

Но почему бы вам просто не сделать эти функции экземплярами функций и позволить им реализовать интерфейс?1013 * Окей, у вас есть объект класса.Затем выполните:

Class c = ...;
c.getMethod("foo").invoke(null); // null to invoke static methods
1 голос
/ 12 мая 2017

Я надеюсь, что это не делает слишком много предположений или отклоняется слишком далеко от вашего вопроса, но если два ваших класса имеют общий супертип и создание экземпляра допустимо, то вы можете:

  1. Реализация общего интерфейса
  2. Создать экземпляр объекта через myClass.newInstance() (класс должен иметь пустой конструктор)
  3. Вызов статического метода из объекта экземпляра.

1012 *
*

interface Foo {
    void foo();
}
class A implements Foo {...}
class B implements Foo {...}

<T extends Foo> public void something(Class<T> clazz) {
    T myInstance = clazz.newInstance();
    myInstance.foo();
}

...
something(A.class);

Это немного странно, но в моем случае это оказалось полезным, и я начал с того же вопроса, что и вы.

1 голос
/ 11 января 2017

Из-за недостатка знаний необходимость в запрошенной конструкции определяется тем фактом, что интерфейс не предоставляет возможности статических абстрактных методов.Вот пример:

public enum Cheese implements Yumy {
  GOUDA(49),
  ESROM(40),
  HWARTI(38);
  private int percentage;
  private Cheese(int fat100) {...} constructor
  public void yamyam() {...} // as in Yumy
  public static Cheese getByFat(int fat100) {...} // no chance to be part
                                                     of interface
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...