java instanceof和getClass()don';I don’我没有按预期工作
我有以下代码:java instanceof和getClass()don';I don’我没有按预期工作,java,inheritance,Java,Inheritance,我有以下代码: protected LogEvent toLogEvent(LogRecord element) { ...... System.out.println("element.getClass():"+element.getClass()); System.out.println("element.getClass() == org.jboss.logmanager.ExtLogRecord.class:" + (element.getClass() == o
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());
输出为:
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
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
ExtLogRecord
是LogRecord
的子类
我的问题是:
false
?显然,元素是ExtLogRecord
的一个实例返回false
,在第四行元素中,LogRecord的instanceof返回true
。所以元素是一个LogRecord
,但它不是一个ExtLogRecord
。这是怎么发生的
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
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
更新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)
当您传递一个
LogRecord
实例而不是子类实例时,您将获得这些输出。考虑到这两个类,并假设它们有一个0-arg构造函数,下面是使用2个实例调用该方法的结果:
toLogEvent(new LogRecord()); // passing superclass instance
System.out.println();
toLogEvent(new ExtLogRecord()); // passing subclass instance
输出:
结果是显而易见的。超类的实例不是也不能是其任何子类的实例。类似地,LogRecord.class
不能等于ExtLogRecord.class
- 第二行输出为false,因为LogRecord.class不相等 到ExtLogRecord.class。您正在传递LogRecord实例,并且 对其子类执行相等性检查
- 您的第三行输出为false,因为无法创建父类实例 它的子类的一个实例
- 第四行输出为true,因为它是LogRecord的一个实例 阶级
希望它有帮助我不希望
LogRecord.class
等于ExtLogRecord.class
,因为关系是,ExtLogRecord
是-aLogRecord
。我也不希望LogRecord
是ExtLogRecord
的实例(出于上述相同的原因)。类的实例仅在类加载器中是不同的。在应用服务器的gubbins内部,许多不同的应用程序都可以使用自己的类加载器运行,事情可能会很奇怪。(抱歉,没有足够的JBoss专家专门回答任何形式的问题。)@Makoto元素的类是ExtLogRecord,如第1行和第5行所示。所以我希望第2行和第3行是正确的。如果它是LogRecord实例,那么为什么第1行说element.getClass():class org.jboss.logmanager.extLogRecord在运行时,该方法将在实际实例上调用。i、 e.ExtLogRecord实例被准确地传递给LogRecord参数类型上的方法。这是一个难题,因为它是一个ExtLogRecord
,但ExtLogRecord的元素实例返回false。这也让我很困惑。我们将询问Rohit Jain:)@mortezakhosravi元素。getClass()
返回实际的对象类型,而不是引用类型。因此,对于LogRecord元素=newextlogrecord()
,它将为您提供ExtLogRecord.class
@mortezakhosravi您确定第一次输出得到ExtLogRecord.class
?因为你们的输出似乎不现实,除非你们在场景中有两个不同的类加载器。如果它是ExtLogRecord.class
,那么它必须是ExtLogRecord
的实例。这就是我的输出显示的原因。应用程序中有两个不同的类加载器?在我头上@我对JBoss一无所知。你能试着比较两个类的类加载器吗element.getClass().getClassLoader()==ExtLogRecord.class.getClassLoader()
看看你得到了什么?@mortezakhosravi看到了吗?这两个类都是从不同的类加载器中加载的,因此结果也是如此。我不能对JBoss相关的问题作太多评论,但可能您可以提供更多关于如何以及从何处调用该方法的细节。