我想使用枚举实现一个基本的状态机;枚举实现了一个界面来管理允许的状态转换。但是我想在属性文件中配置实现接口的枚举的类名列表,并且应该在特定的上下文中使用。上下文在运行时确定,并且该上下文键映射到属性文件中的属性键。从属性文件中获取上下文的枚举类名后,如何使用该类名获取实例引用以通过接口方法使用该枚举?我可以看到你可以使用反射来发现特定枚举的属性,但就是这样。有任何想法吗?
答案 0 :(得分:1)
你正确使用反射:
从属性文件中读取类名后,使用Class.forName
获取正确的Class
对象。确保传入完全限定的类名。您需要在此处捕获各种已检查的例外情况。
使用isEnum
方法并使用界面isAssignableFrom
对象中的Class
方法确保它是实现界面的枚举。
isEnum()&& YourInterface.class.isAssignableFrom(clazz中)
使用静态Enum.valueOf
方法从String
获取实际枚举常量并将其强制转换为您的界面。
(YourInterface) Enum.valueOf(clazz, stringName)
答案 1 :(得分:1)
我写了这个......它可以帮到你:
public class MyTests {
static enum XX implements Runnable {
A, B;
public void run() {
System.out.println( "I'm enum value: " + this.name() );
}
}
public static void main( String[] args ) throws Exception {
new MyTests();
}
public MyTests() throws Exception {
Class<?> loaded = Class.forName("MyTests$XX");
Class<? extends Runnable> xx = loaded.asSubclass(Runnable.class);
Runnable[] enumConstants = xx.getEnumConstants();
for ( Runnable runnable : enumConstants ) {
runnable.run();
}
}
}
这将打印:
I'm enum value: A
I'm enum value: B
答案 2 :(得分:0)