gpt4 book ai didi

Java:使用反射从数字实例化枚举

转载 作者:行者123 更新时间:2023-12-02 07:56:15 25 4
gpt4 key购买 nike

信令协议(protocol)经常使用具有明确定义的整数值的枚举类型。例如

public enum IpHdrProtocol {

TCP(6),
SCTP(132),
MPLS(137);
int Value;

IpProtocol(int value) {
Value = value;
}

我正在尝试找到一种仅使用枚举类类型和实例的整数值将此类值反序列化为其相应枚举类型的方法。

如果这需要将静态 getEnumFromInt(int) 函数添加到每个枚举,那么如何定义这个“接口(interface)”,以便枚举作者可以确保他们的枚举可以序列化。

怎样才能最好地做到这一点?

最佳答案

不确定你想走多远,但这里有一些相当丑陋的代码,可以减少对你的枚举的侵入:

public class Main {

public enum IpHdrProtocol {

TCP(6), SCTP(132), MPLS(137);
int Value;

IpHdrProtocol(int value) {
Value = value;
}
}

public static void main(String[] argv) throws NoSuchMethodException, IllegalArgumentException, InvocationTargetException,
IllegalAccessException, SecurityException, NoSuchFieldException {
System.err.println(getProtocol(6));
System.err.println(getProtocol(132));
System.err.println(getProtocol(137));
}

private static IpHdrProtocol getProtocol(int i) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException,
SecurityException, NoSuchFieldException {
Field f = IpHdrProtocol.class.getDeclaredField("Value");
Method m = IpHdrProtocol.class.getMethod("values", null);
Object[] invoke = (Object[]) m.invoke(null, null);
for (Object o : invoke) {
if (!f.isAccessible()) {
f.setAccessible(true);
}
if (((Integer) f.get(o)).intValue() == i) {
return (IpHdrProtocol) o;
}
}
return null;
}

}

关于Java:使用反射从数字实例化枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9601277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com