class A {
public static void foo() {}
}
class B {
public static void foo() {}
}
Run Code Online (Sandbox Code Playgroud)
我有Class clazz = A.class; or B.class;
我如何通过"clazz"访问它,假设它可能被指定为'A'或'B'
Hen*_*ann 31
只能使用反射访问这些方法.您不能直接引用类,只能引用类的实例.
要使用反射来调用methodname(int a,String b):
Method m = clazz.getMethod("methodname", Integer.class, String.class);
m.invoke(null, 1, "Hello World!");
Run Code Online (Sandbox Code Playgroud)
请参见Class.getMethod()和Method.invoke()
您可能想再次考虑您的设计,以避免动态调用静态方法.
krt*_*tek 10
您可以通过反射调用静态方法,如下所示:
Method method = clazz.getMethod("methodname", argstype);
Object o = method.invoke(null, args);
Run Code Online (Sandbox Code Playgroud)
其中argstype是参数类型的数组,args是调用的参数数组.有关以下链接的更多信息:
在你的情况下,这样的事情应该工作:
Method method = clazz.getMethod("foo", null);
method.invoke(null, null); // foo returns nothing
Run Code Online (Sandbox Code Playgroud)
如果没有对类的显式引用,则无法访问静态方法.
这里没有继承,对不起,所以你必须这样做:
A.foo()
Run Code Online (Sandbox Code Playgroud)
要么
B.foo()
Run Code Online (Sandbox Code Playgroud)
如果你真的需要它,你将不得不做一个检查:
Object o = .... // eith an A or B instance.
if( o instanceof A ) {
A.foo()
} else {
B.foo()
}
Run Code Online (Sandbox Code Playgroud)
但是你为什么不直接创建那些函数实例函数,让它们实现一个接口呢?
哦,你有一个类对象.然后做:
Class c = ...;
c.getMethod("foo").invoke(null); // null to invoke static methods
Run Code Online (Sandbox Code Playgroud)