在Java

时间:2015-06-12 06:20:09

标签: java

我有一些代码需要在多个Java应用程序中重用。该代码实现了一个GUI,而GUI又需要从调用类访问一些静态变量和方法。这些变量和方法在所有应用程序中始终称为相同。是否有一种通用的方法来获取Java中的调用类的句柄,以便" someGUI" class可以保持不变,实际上来自所有不同应用程序的相同源文件?

最小的工作示例:

import javax.swing.*;

class test {
  static int variable = 123;
  public static void main(String[] args) {
    someGUI sg = new someGUI();
    sg.setVisible(true);
  }
}

class someGUI extends JFrame {
  public someGUI() {
    System.out.println(String.format("test.variable = %d", test.variable));
  }
}

我如何" generify"引用" test"在test.variable中总是只是引用调用类?它不是"超级"类,至少使用super.variable不起作用。

2 个答案:

答案 0 :(得分:1)

首先,我建议反对这种方法,因为只有脆弱的方法来实现它。您应该使用包含所需值的参数来参数化SomeGUI

但是,可以通过检查线程的堆栈跟踪并使用反射按名称访问静态字段来执行您的要求。例如:

class Test {
    static int variable = 123;

    public static void main(String[] args) throws Exception {
        SomeGUI sg = new SomeGUI();
    }

    static class SomeGUI extends JFrame {

        public SomeGUI() throws Exception {
            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
            // stackTrace[0] is getStackTrace(), stackTrace[1] is SomeGUI(),
            // stackTrace[2] is the point where our object is constructed.
            StackTraceElement callingStackTraceElement = stackTrace[2];
            String className = callingStackTraceElement.getClassName();
            Class<?> c = Class.forName(className);
            Field declaredField = c.getDeclaredField("variable");
            Object value = declaredField.get(null);
            System.out.println(String.format("test.variable = %d", value));
        }
    }
}

这将打印test.variable = 123

显然,这对变量的重命名很敏感。它对动态代理也很敏感。

此外,应该注意您需要在构造函数中执行此操作。如果您尝试在其他方法中执行此类查找,则无法找到实例的创建方式。

答案 1 :(得分:0)

  1. somGUI和test之间没有继承, someGUI和JFrame之间存在实际的继承。 如果你使用super(),JVM会尝试查找&#39;变量&#39;在JFrame中,这不是你想要的。
  2. 使用静态方法setter&amp; getters访问&#39;变量&#39;而不是直接访问它们。