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

时间:2011-03-05 09:53:05

标签: java reflection

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

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

我有Class clazz = A.class; or B.class;

我如何通过“clazz”访问此内容,假设它可能被指定为“A”或“B”

5 个答案:

答案 0 :(得分:32)

只能使用反射访问这些方法。您不能直接引用类,只能引用类型的实例。

使用反射来调用methodname(int a,String b):

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

请参阅Class.getMethod()Method.invoke()

您可能需要再次考虑您的设计,以避免动态调用静态方法。

答案 1 :(得分:10)

您可以通过这样的反射来调用静态方法:

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

答案 2 :(得分:5)

如果没有明确引用该类,则无法访问静态方法。

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

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

答案 3 :(得分:1)

根据我的缺乏知识,对接口不提供静态抽象方法的可能性给出了对所请求构造的需求。这是一个例子:

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

答案 4 :(得分:1)

我希望这不会做太多假设或偏离你的问题太远,但如果你的两个类共享一个共同的超类型并且创建一个实例是可以容忍的,那么你可以:

  1. 实施通用界面
  2. 通过 var fname = $('#personalOptionsForm').find('[name="fname"]').val() , lname = $('#personalOptionsForm').find('[name="lname"]').val() , cellphone = $('#personalOptionsForm').find('[name="cellphone"]').val(), email = $('#personalOptionsForm').find('[name="email"]').val(), //dummy values fname = 'abc', lname="dksjdn", cellphone = "98989898", email = "abc@gmail.com"; if($('#showPhoneId').is(':checked') == true) { showPhone = 1; } else { showPhone = 0; }; // showPhone = (($('input[name="showInSignature[]"]').is(':checked') == true) ? 1 : 0), // showEmail = (($('input[name="showInSignature[]"]').is(':checked') == true) ? 1 : 0), str = "<strong>" + fname + " " + lname + "</strong><br /><br />" + ((showPhone == 1) ? 'Tel&eacute;fono: ' + cellphone + '<br />' : '') + "E-mail: <a href=\"mailto:" + email + "\">" + email + "</a>", html = $.parseHTML( str ); $('#signaturePreview').append(html); 创建对象的实例(类必须有空构造函数)
  3. 从实例对象中调用静态方法。

  4. myClass.newInstance()

    这有点奇怪,但在我的情况下,它证明是有用的,我开始问你所做的同样的问题。