我想知道你是否能看到我的代码有什么问题。
首先我有这个课程
package de.daisi.async.infrastructure.component.event;
import static de.daisi.async.infrastructure.component.event.CType.*;
public class TemperatureEvent implements IEvent {
private static final long serialVersionUID = 1L;
private CType cType = ONEP_ONEC;
public String toString(){
return "TemperatureEvent";
}
public CType getcType() {
return cType;
}
}
通过java反射我想得到CType值(ONEP_ONEC)
package de.daisi.async.infrastructure.comunicationtype;
import de.daisi.async.infrastructure.component.event.*;
import java.lang.reflect.Method;
public class CheckComType {
public CType checkType(Class<? extends IEvent> eventClass) {
System.out.println("Check communcationType: " + eventClass);
CType cType = null;
try {
System.out.println("---In Try---");
Class cls = (Class) eventClass;
System.out.println("cls: " + cls);
Method method = cls.getDeclaredMethod("getcType");
System.out.println("method: " + method);
Object instance = cls.newInstance();
cType = (CType) method.invoke(instance);
System.out.println("instance: " + instance);
System.out.println("cType: " + cType);
} catch (Exception ex) {
ex.printStackTrace();
}
return cType;
}
public static void main(String... args){
CheckComType type = new CheckComType();
CType testType = type.checkType(TemperatureEvent.class);
System.out.println("testType: " + testType);
}
}
testType结果为null,我得到了ClassCastException
java.lang.ClassCastException: de.daisi.async.infrastructure.component.event.CType无法强制转换为 de.daisi.async.infrastructure.comunicationtype.CType at de.daisi.async.infrastructure.comunicationtype.CheckComType.checkType 在de.daisi.async.infrastructure.comunicationtype.CheckComType.main
有什么建议吗? 提前谢谢
答案 0 :(得分:1)
您显然有两个不同的CType
类,一个在de.daisi.async.infrastructure.component.event
包中,另一个在de.daisi.async.infrastructure.comunicationtype
中。由于您未在de.daisi.async.infrastructure.component.event.CType
中明确引用CheckComType
,因此会使用同一个包中的类(即de.daisi.async.infrastructure.comunicationtype.CType
)。
在Java中,完整的类名是重要的。包本质上是命名空间,属于不同包的类是不同的类,即使它们的名称相同。
de.daisi.async.infrastructure.component.event.CType cType = null;
try {
//...
cType = (de.daisi.async.infrastructure.component.event.CType) method.invoke(instance);
}
等等。
如果您不打算在同一个班级同时使用import de.daisi.async.infrastructure.component.event.CType
,那么只需在CheckComType
中明确CType
。