gpt4 book ai didi

java - 为什么 this.getClass().getName() 会产生与 StackTraceElement.getClassName() 不同的结果?

转载 作者:行者123 更新时间:2023-12-02 11:16:01 25 4
gpt4 key购买 nike

我的问题是为什么 ElementModel 构造函数中的代码 this.getClass().getName() 会生成 BaseModel$1 作为结果而不是 ElementModel?

此外,您会注意到 BaseModel 构造函数中的相同代码将为您提供 CellModel。

简单地说,我希望代码在 ElementModel 构造函数中调用时会给我 ElementModel。在 BaseModel 构造函数中调用 BaseModel 时。然而,事实并非如此。

此外,您还会注意到,在方法 demo2 中,代码 st.getClassName() 将生成 ElementMode,这是预期的结果。

因此我在这里很困惑。任何人都可以阐明这一点,我们将不胜感激。

基础:

public class BaseModel<E> {

protected ElementModel<E> addedElements;

public BaseModel() {
String msg = this.getClass().getName();
System.out.println("BaseModel::BaseModel.......this.getClass.getName(): "+msg);
addedElements = new ElementModel<E>(){};
}
}

元素模型:

public class ElementModel<E> {
public ElementModel() {
String msg = this.getClass().getName();
System.out.println("ElementModel::ElementModel.......this.getClass.getName(): "+msg);
}

public void add(E e) {
demo1();
demo2();
}

private void demo1() {

System.out.println("\n==================== Begin demo1 ========================");
String msg = this.getClass().getName();
System.out.println("ElementModel::demo1.......this.getClass.getName(): "+msg);;
msg = this.getClass().getSimpleName();
System.out.println("ElementModel::demo1.......this.getClass.getSimpleName(): "+msg);
msg = this.getClass().getTypeName();
System.out.println("ElementModel::demo1.......this.getClass.getTypeName(): "+msg);
msg = this.getClass().toGenericString();
System.out.println("ElementModel::demo1.......this.getClass.toGenericString: "+msg);
StackTraceElement[] ste = Thread.currentThread().getStackTrace();
int i=0;
for(StackTraceElement st : ste)
{
System.out.println(i+++": "+st.toString());
}
System.out.println("==================== End demo1 ========================\n");
}

private void demo2() {

System.out.println("\n**************** Begin demo2 **************************");
String msg = this.getClass().getName();
System.out.println("ElementModel::demo2.......this.getClass.getName(): "+msg);
StackTraceElement[] ste = Thread.currentThread().getStackTrace();
for(StackTraceElement st : ste) {
if (st.getMethodName().equalsIgnoreCase("add")) {
System.out.println("ElementModel::demo2.......st.getClassName: "+st.getClassName());
System.out.println("ElementModel::demo2.......Thread.class.getName: "+Thread.class.getName());
}
}
System.out.println("**************** End demo2 **************************\n");

}
}

细胞模型:

public class CellModel<E> extends BaseModel<E> {

public CellModel() {
String msg = this.getClass().getName();
System.out.println("CellModel::CellModel.......this.getClass.getName(): "+msg);

addedElements.add(null);
}
}

主要测试:

public class TheTest extends Application {

@Override
public void start(Stage primaryStage) {
System.out.println("test");
CellModel<String> s = new CellModel<>();

primaryStage.show();
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}

最佳答案

new ElementModel<E>(){};

创建一个扩展ElementModel的匿名内部类。 ElementModel 的构造函数打印实际类的名称,而不是 ElementModel 本身的名称。你应该写

new ElementModel<E>();

编辑匿名内部类的名称是BaseModel$1,因为它是BaseModel的匿名内部类。

关于java - 为什么 this.getClass().getName() 会产生与 StackTraceElement.getClassName() 不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50284701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com