class A {
public static void foo() {}
}
class B {
public static void foo() {}
}
У меня Class clazz = A.class; or B.class
;
Как мне получить доступ к этому с помощью "clazz", предполагая, что ему могут назначаться либо "A", либо "B"
class A {
public static void foo() {}
}
class B {
public static void foo() {}
}
У меня Class clazz = A.class; or B.class
;
Как мне получить доступ к этому с помощью "clazz", предполагая, что ему могут назначаться либо "A", либо "B"
Доступ к этим методам возможен только с помощью отражения. Вы не можете напрямую ссылаться на класс, только экземпляр типа 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()
Вы можете снова подумать о своем дизайне, чтобы избежать необходимости динамического вызова статических методов.
Вы можете вызвать статический метод с помощью отражения следующим образом:
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
Вы не можете получить доступ к статическим методам без явной ссылки на класс.
Нет наследования здесь, извините, поэтому вы должны либо сделать:
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
Согласно моей нехватке знаний, потребность в запрошенной конструкции определяется тем фактом, что интерфейс не предлагает возможности статических абстрактных методов. Вот пример:
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
};
Я надеюсь, что это не слишком много предположений или слишком далеко от вашего вопроса, но если ваши два класса имеют общий супертип и создание экземпляра терпимо, вы можете:
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);
Это немного странно, но в моем случае это оказалось полезным, и я начал с того, что задал тот же самый вопрос, что и вы.