我有以下代码:
protected LogEvent toLogEvent(LogRecord element) {
......
System.out.println("element.getClass():"+element.getClass());
System.out.println("element.getClass() == org.jboss.logmanager.ExtLogRecord.class:" + (element.getClass() == org.jboss.logmanager.ExtLogRecord.class));
System.out.println("element instanceof org.jboss.logmanager.ExtLogRecord:" + (element instanceof org.jboss.logmanager.ExtLogRecord));
System.out.println("element instanceof java.util.logging.LogRecord:"+(element instanceof java.util.logging.LogRecord));
System.out.println("element.toString():"+element.toString());
Run Code Online (Sandbox Code Playgroud)
输出是:
09:20:51,544 INFO stdout element.getClass():class org.jboss.logmanager.ExtLogRecord
09:20:51,545 INFO stdout element.getClass() ==org.jboss.logmanager.ExtLogRecord.class:false
09:20:51,547 INFO stdout element instanceof org.jboss.logmanager.ExtLogRecord:false
09:20:51,548 INFO stdout element instanceof java.util.logging.LogRecord:true
09:20:51,549 INFO stdout element.toString():org.jboss.logmanager.ExtLogRecord@2657c0ad
Run Code Online (Sandbox Code Playgroud)
ExtLogRecord
是.的子类LogRecord
.
我的问题是:
在第二行为false
什么输出?清楚元素是一个实例ExtLogRecord
.
在第三行元素instanceof ExtLogRecord
返回false
并在第四行元素instanceof LogRecord
返回true
.所以元素是一个,LogRecord
但它不是一个ExtLogRecord
.这是怎么回事?
更新:
我添加了一些关于类加载的附加代码.输出是:
10:32:48,372 INFO stdout (new ExtLogRecord()) instanceof ExtLogRecord:true
10:32:48,374 INFO stdout new ExtLogRecord(org.jboss.logmanager.Level.ALL,"","").getClass():class org.jboss.logmanager.ExtLogRecord
10:32:48,376 INFO stdout LogRecord.class.getClassLoader():null
10:32:48,377 INFO stdout ExtLogRecord.class.getClassLoader():"ModuleClassLoader for Module "org.tamin.tiba.logging.jboss.handlers:main" from local module loader@416a8198(roots: D:\java\jbossas\modules)
10:32:48,378 INFO stdout LogRecord.class.getClassLoader() == ExtLogRecord.class.getClassLoader():false
Run Code Online (Sandbox Code Playgroud)
更新2:
额外的类加载比较:
10:43:14,113 INFO stdout element.getClass().getClassLoader() == ExtLogRecord.class.getClassLoader():false
10:43:14,115 INFO stdout element.getClass().getClassLoader():ModuleClassLoader for Module "org.jboss.logmanager:main" from local module loader @576fb9a5 (roots: D:\java\jbossas\modules)
Run Code Online (Sandbox Code Playgroud)
您在传递LogRecord
实例时获取这些输出,而不是子类实例.考虑这两个类,并假设它们有一个0-arg构造函数,下面是调用带有2个实例的方法的结果:
toLogEvent(new LogRecord()); // passing superclass instance
System.out.println();
toLogEvent(new ExtLogRecord()); // passing subclass instance
Run Code Online (Sandbox Code Playgroud)
输出:
element.getClass():class LogRecord
element.getClass() == ExtLogRecord.class:false
element instanceof ExtLogRecord:false
element instanceof LogRecord:true
element.toString():LogRecord@182f0db
element.getClass():class ExtLogRecord
element.getClass() == ExtLogRecord.class:true
element instanceof ExtLogRecord:true
element instanceof LogRecord:true
element.toString():ExtLogRecord@192d342
Run Code Online (Sandbox Code Playgroud)
输出很明显.超类的实例不是也不能是其任何子类的实例.同样,LogRecord.class
也不能等于ExtLogRecord.class
.