如何通过类引用访问静态方法

use*_*108 20 java reflection

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)


Dan*_*iel 5

如果没有对类的显式引用,则无法访问静态方法.

这里没有继承,对不起,所以你必须这样做:

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)

  • @ user339108`interface`**是**继续这里的方式,只要确保`A`和`B`不是内部类. (2认同)
  • 接口不能声明静态方法.最后一部分,至少在两个答案中更好地解释了它 (2认同)