我的应用程序中的所有相关类都将类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());
}
}
答案 0 :(得分:2)
不,你想做什么都行不通。变量类型需要在编译时使用已知类型声明。
使用适当的封装。
定义接口HasLogger
(或最适合的名称),定义返回getLogger
值的方法Logger
。让您的课程ClassA
,ClassB
等实现此界面。
将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();
}
}
}
}