我的问题是,为什么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/

10-11 23:19