【问题标题】:How to cast java.lang.reflect.Type to enum? [duplicate]如何将 java.lang.reflect.Type 转换为枚举? [复制]
【发布时间】:2014-01-31 15:02:35
【问题描述】:

我有一个相当简单的问题。
我有一个 java.lang.reflect.Type 类型的变量,我想对它做两件不同的事情,以防它持有类或枚举。我可以通过简单地询问.isEnum() 来相当简单地检查变量是否为枚举。但是,要调用特定的枚举方法,我需要将此变量转换为枚举。这是一些用于说明的代码。我知道这没什么意义,但它只是为了演员说明:

public class TestClass {
    public static String text = "MySampleTextClass.";
}
public enum TestEnum {
    MySampleText
}
public class Tester {
    public static Object retrieveValue (java.lang.reflect.Type myVar, String enumStringValue) {
        String enumStringValue = "MySampleText";

        // the variable is enum!!!
        if (myVar.isEnum()) {
            return (Enum myVar).valueOf(enumStringValue);
        }
        // the variable is class!!!
        else {
            return myVar.getClass().getSimpleName();
        }
    }
}

我试过像

这样的演员表
(java.lang.Enum myVar).valueOf(enumString);

(java.lang.Enum<?> myVar).valueOf(enumString); 

但我不能让它工作。

有什么想法吗?

【问题讨论】:

  • Type 没有 isEnum 方法。使用Class不是更简单吗?

标签: java reflection enums


【解决方案1】:

使用在抽象类Enum中声明的静态方法valueOf

Class clazz = (Class) myVar;
if (clazz.isEnum()) {
    return Enum.valueOf(clazz, enumStringValue);
}

但是 ... 转换为 Class 是必要的,因为 java.lang.reflect.Type 只是一个标记接口。此外,您必须强制转换为原始类型 Class 才能使其工作。您可以进入许多运行时陷阱。

总的来说,有这样的要求是非常难得的。为什么你必须使用反射来检索你甚至不知道类型的枚举值?

【讨论】:

  • 你真的应该在转换之前使用instanceof检查它是否是Class对象。
  • @Powerlord 我认为通常在使用反射时,最好使用Class.isInstance(object) 而不是instance of
  • @Powerlord:是的,你是对的。但这不是这段代码 sn-p 的唯一问题。我不想让它更复杂。
  • @JeffGohlke isInstance 不是静态方法。
  • 我同意你所有的 cmets 我写的代码只是为了说明我上面解释的铸造想法。非常感谢 Seelenvirtuose。这正是我所需要的。解决了。​​
猜你喜欢
  • 2012-02-16
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多