是否可以使用 getClass() 声明一个 Java Class 变量?

is it possible to declare a Java Class variable using getClass()?

我的应用程序中所有相关的 classes 将 class Logger 的一个版本实例化为 logger = new Logger()。任何 class 都可以调用它的 logger.setText(String text) 实例。

ClassA 中的 writeText(Object parameter) 方法被构建为通过调用 logger.getText() 的每个 class 实例从 logger 的每个实例中获取先前设置的字符串.

目前,我已经为每个 classes 在 wrtieText 中放置了一个条件。这可行,但如果我最终添加更多 classes 可能会成为一个问题。我想要一个包罗万象的 writeText 方法来适应可能添加的任何新 classes。

以下是目前的工作模型。在此之下,我包含了 ClassA 的替代版本,它试图通过使用 getClass() 方法来完成我正在描述的内容。

ClassA.java

public class ClassA {
   public static void main(String[] args) {
      ClassA classA = new ClassA();
      classA.execute();
   }

   public void execute() {
     ClassB doSomething = new ClassB();
     writeText(doSomething);

     ClassC doSomethingElse = new ClassC();
     writeText(doSomethingElse);
   }

   public void writeText(Object parameter) {
      if(parameter instanceof ClassB) {
         ClassB x = (ClassB) parameter;
         System.out.println(x.logger.getText() + "\n\n");
      }

      if(parameter instanceof ClassC) {
          ClassC x = (ClassC) parameter;
          System.out.println(x.logger.getText() + "\n\n");
      }

      if(parameter instanceof ClassD) {
          ClassD x = (ClassD) parameter;
          System.out.println(x.logger.getText() + "\n\n");
      }
   }
}

Logger.java

public class Logger {
   private String text = "";

   public void setText(String text) {
      this.text = text;
   }

   public String getText() {
      return this.text;
   }
}

ClassB.java

public class ClassB {
   Logger logger = new Logger();

   public ClassB() {          
      logger.setText("Hello from ClassB!");
   }
}

ClassC.java

public class ClassC {
   Logger logger = new Logger();

   public ClassC() {
      logger.setText("Hello from ClassC!");
   }
}

我正在尝试调用 getClass() 方法来解决任何 class 问题,但 运行 遇到了一些问题。

ClassA.java

public class ClassA {
   public static void main(String[] args) {
      ClassA classA = new ClassA();
      classA.execute();
   }

   public void execute() {
     ClassB doSomething = new ClassB();
     writeText(doSomething);

     ClassC doSomethingElse = new Class();
     writeText(doSomethingElse);
   }

   public void writeText(Object parameter) {
      Class aClass = parameter.getClass();

      // now what? The following doesn't work as expected
      aClass x = (aClass) parameter;
      System.out.println(x.logger.getText());   
   }
}

不,你正在尝试做的是行不通的。变量类型需要在编译时用已知类型声明。

使用适当的封装。

定义一个接口 HasLogger(或任何最合适的名称),它定义一个方法 getLogger,returns 一个 Logger 值。让你的类ClassAClassB等实现这个接口。

更改您的 writeText 方法以接受类型 Loggable 的参数,然后只获取 Logger

public void writeText(HasLogger parameter) {
    System.out.println(parameter.getLogger().getText());   
}

是的,可以通过反射来做到这一点。您可以迭代字段,然后在 Logger 字段上调用您的方法。像,

public void writeText(Object parameter) {
    Class<?> aClass = parameter.getClass();
    for (Field f : aClass.getDeclaredFields()) {
        if (f.getName().equals("logger")) {
            try {
                f.setAccessible(true);
                Logger log = (Logger) f.get(parameter);
                System.out.println(log.getText());  
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}