java反射铸造问题

时间:2016-08-10 17:32:03

标签: java reflection

我想知道你是否能看到我的代码有什么问题。

首先我有这个课程

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

有什么建议吗? 提前谢谢

1 个答案:

答案 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