Как я могу преобразовать строку протокола в перечисление протокола Spymemcached с помощью Java Reflection? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть приложение Java 5, которое использует Spymemcached, и у меня возникла проблема, когда я хочу преобразовать строку протокола в объект Enum. Давайте рассмотрим следующее:

  1. Протокол перечисления находится в классе ConnectionFactoryBuilder.
package net.spy.memcached;

...

public class ConnectionFactoryBuilder {

    public enum Protocol {
        TEXT, BINARY

        private Protocol() {
            // compiled code
        }
    }
Теперь мне нужно преобразовать строку "TEXT" или "BINARY" в перечисленное выше перечисление ConnectionFactoryBuilder.Protocol. Я попробовал следующий код, но ничего не работает.
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, 

    }

}

Пожалуйста, помогите, спасибо!

1 Ответ

0 голосов
/ 14 октября 2019

Хорошо, я нашел, как решить эту проблему. По сути, enum 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

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...