是否可以使用getClass()声明Java类变量?

时间:2015-02-17 04:38:56

标签: java reflection instance-variables getter-setter

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

writeText(Object parameter)中的ClassA方法用于通过调用logger的实例来从logger.getText()的每个类实例中获取先前设置的字符串。

目前,我已为每个类在wrtieText内添加条件。这有效,但如果我最终添加更多类,可能会成为一个问题。我想要一个全能writeText方法来适应可能添加的任何新类。

以下是目前正在运行的模型。在此之下,我已经包含了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()方法以便考虑具有以下内容的任何类,但它遇到了一些问题。

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

2 个答案:

答案 0 :(得分:2)

不,你想做什么都行不通。变量类型需要在编译时使用已知类型声明。

使用适当的封装。

定义接口HasLogger(或最适合的名称),定义返回getLogger值的方法Logger。让您的课程ClassAClassB等实现此界面。

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

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

答案 1 :(得分:0)

是的,可以用反射来做。您可以迭代这些字段,然后在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();
            }
        }
    }
}