Подтвердить что ты не робот

Как получить доступ к статическому методу с помощью ссылки на класс

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

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

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

Как мне получить доступ к этому с помощью "clazz", предполагая, что ему могут назначаться либо "A", либо "B"

4b9b3361

Ответ 1

Доступ к этим методам возможен только с помощью отражения. Вы не можете напрямую ссылаться на класс, только экземпляр типа 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()

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

Ответ 2

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

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

Ответ 3

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

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

A.foo()

или

B.foo()

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

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

Но почему бы вам просто не сделать эти функции экземпляров функций и позволить им реализовать интерфейс?

Okey, у вас есть объект класса. Затем выполните:

Class c = ...;
c.getMethod("foo").invoke(null); // null to invoke static methods

Ответ 4

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

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
};

Ответ 5

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

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


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);

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