是否可以使用 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
值。让你的类ClassA
、ClassB
等实现这个接口。
更改您的 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();
}
}
}
}
我的应用程序中所有相关的 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
值。让你的类ClassA
、ClassB
等实现这个接口。
更改您的 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();
}
}
}
}