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