如何使用Java反射将协议字符串转换为SpymeCached协议枚举?

如何使用Java反射将协议字符串转换为SpymeCached协议枚举?,java,reflection,enums,Java,Reflection,Enums,我有一个Java 5应用程序,它使用SpymeMached,当我想将协议字符串转换为Enum对象时遇到了一个问题。让我们来看看下面的内容: 枚举协议位于ConnectionFactoryBuilder类中 现在我需要将字符串“TEXT”或“BINARY”转换为上面的ConnectionFactoryBuilder.Protocol枚举。我尝试了以下代码,但没有任何效果 请帮忙,谢谢 好的,我已经找到了解决这个问题的方法。基本上,枚举协议是ConnectionFactoryBuilder中的嵌套类

我有一个Java 5应用程序,它使用SpymeMached,当我想将协议字符串转换为Enum对象时遇到了一个问题。让我们来看看下面的内容:

  • 枚举协议位于ConnectionFactoryBuilder类中
  • 现在我需要将字符串“TEXT”或“BINARY”转换为上面的ConnectionFactoryBuilder.Protocol枚举。我尝试了以下代码,但没有任何效果

  • 请帮忙,谢谢

    好的,我已经找到了解决这个问题的方法。基本上,枚举协议是ConnectionFactoryBuilder中的嵌套类,因此我需要使用
    $
    来定位它

    下面是代码:

    package mypackage;
    
    public class Test {
    
        public static void main(String[] args) throws Exception {
    
            String protocolString = "TEXT";
    
            // code 1:
            // OLD: String protocolClassName1 = "net.spy.memcached.ConnectionFactoryBuilder.Protocol";
            String protocolClassName1 = "net.spy.memcached.ConnectionFactoryBuilder$Protocol";
            Class protocolType1 = Class.forName(protocolClassName1); 
            Object protocolEnumObject1 = Enum.valueOf(protocolType1, protocolString);
    
            System.out.println(protocolEnumObject1.getClass());
            // class net.spy.memcached.ConnectionFactoryBuilder$Protocol
    
        }
    
    }
    

    为什么要反思?为什么不直接使用
    valueOf()
    ?因为我的应用程序是用Java 5编写的,但是SpymeCached支持Java 6+,所以除非您将应用程序升级到Java 6(顺便说一句,这应该很简单),否则您无法使用它。反射在这里解决不了任何问题。没有人,我的应用程序中的SpymeCached功能只支持Java6+用户。我需要用Java 5编译我的应用程序以支持旧系统,这就是为什么我需要使用Java 6+反射功能如果该功能用于Java 6,那是有原因的:字节码是Java 6,你不能用Java 5运行它。再说一次,反思并不能解决你的问题,但请做我的客人。在任何情况下,让你的问题更清楚,目前你没有正确地解释你的问题。
    package mypackage;
    
    import java.lang.reflect.Field;
    
    public class Test {
    
        public static void main(String[] args) throws Exception {
    
            String protocolString = "TEXT";
    
            // code 1:
            String protocolClassName1 = "net.spy.memcached.ConnectionFactoryBuilder.Protocol";
            Class protocolType1 = Class.forName(protocolClassName1); 
            // The above line throws: Exception in thread "main" java.lang.ClassNotFoundException: net.spy.memcached.ConnectionFactoryBuilder.Protocol
            Object protocolEnumObject1 = Enum.valueOf(protocolType1, protocolString);
    
    
            // code 2:
            Class connectionFactoryBuilderClass2 = Class.forName("net.spy.memcached.ConnectionFactoryBuilder");
            Field protocolField2 = null;
            for (Field f : connectionFactoryBuilderClass2.getDeclaredFields()) {
                System.out.print(f.getName() + ", ");
                if (f.getName().equalsIgnoreCase("Protocol")) {
                    protocolField2 = f;
                }
            }
            Class protocolType2 = protocolField2.getType();
            Object protocolEnumObject2 = Enum.valueOf(protocolType2, protocolString);
            // In this approach, i can not get protocol field in that ConnectionFactoryBuilder class, here are output of getDeclaredFields():
            // opQueueFactory, readQueueFactory, writeQueueFactory, transcoder, failureMode, 
            // initialObservers, opFact, locator, opTimeout, isDaemon, shouldOptimize, useNagle, 
            // maxReconnectDelay, readBufSize, hashAlg, authDescriptor, opQueueMaxBlockTime, 
            // timeoutExceptionThreshold, metricType, collector, executorService, authWaitTime, $assertionsDisabled, 
    
        }
    
    }
    
    
    package mypackage;
    
    public class Test {
    
        public static void main(String[] args) throws Exception {
    
            String protocolString = "TEXT";
    
            // code 1:
            // OLD: String protocolClassName1 = "net.spy.memcached.ConnectionFactoryBuilder.Protocol";
            String protocolClassName1 = "net.spy.memcached.ConnectionFactoryBuilder$Protocol";
            Class protocolType1 = Class.forName(protocolClassName1); 
            Object protocolEnumObject1 = Enum.valueOf(protocolType1, protocolString);
    
            System.out.println(protocolEnumObject1.getClass());
            // class net.spy.memcached.ConnectionFactoryBuilder$Protocol
    
        }
    
    }