Java:对静态类的存储引用是可变的

时间:2018-11-12 09:35:04

标签: java

我需要在变量中存储对类的引用,以便可以在变量上调用该类的静态方法。

Main.java

public class Main {

    private static SomeClass cls;

    private static void main(String[] args) {
        **cls = SomeClass;**
        cls.doSomething();
    }

SomeClass.java

public class SomeClass() {
    public static doSomething() {
    }
}

cls = SomeClass在这里不起作用,但我也不想实例化SomeClass。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

这没有道理。

您可以写

private static SomeClass cls = null;

(或保留未分配状态,因为默认值始终为null

cls.doSomething()

不会抛出NullPointerException,而是会调用静态方法。

但是,没有理由这样做。无论您为cls变量分配什么内容,它都将始终调用SomeClass.doSomething(),因此消除该变量并仅调用SomeClass.doSomething()更为有意义。

  

想法是cls可以根据上面代码中未提供的某些条件引用多个类

这个想法行不通。 cls变量的编译时间类型将确定所调用的static方法的类。由于它只能具有单一类型,因此它将始终是相同的static方法。

答案 1 :(得分:0)

您可以将反射用于此要求。下面是示例:

public class Reference {

    public static Class clazz = null;

    public static void main(String[] args) {
        try {
            refer(Something.class);
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void refer(Class clazzToBeCalled) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        clazz = clazzToBeCalled; //No need to store it on class level
        Method methodToBeCalled = clazz.getMethod("doSomething");
        methodToBeCalled.invoke(null);
    }
}