Получить класс по части имени в Java - PullRequest
0 голосов
/ 01 марта 2012

Хорошо, поэтому я пытаюсь выполнить обработку сетевых пакетов в Java с использованием классов. Для чтения данных из моего потока я использую DataInputStream. Моя ветка чтения для моего сервера выглядит так:

public void run()
    {
        while(client.isActive())
        {
            try{
                handle(is.readShort());
            }catch (IOException e){
                client.stop(e);
                break;
            }
        }
    }

Теперь у меня есть дескриптор метода:

public void handle(short id) throws IOException
{
    InPacket packet = null;

    try {
        packet = ClassUtils.newInstance(InPacket.class, "server.client.InPacket"+id);
    }catch (Exception e){
        e.printStackTrace();
    }

    if (packet!=null){
        packet.handle(this);
    }
    else{
        throw new IOException("Invalid packet");
    }
}

Я пытаюсь создать новый класс, используя

packet = ClassUtils.newInstance(InPacket.class, "server.client.InPacket"+id);

линия.

В ClassUtils это та функция:

public static <T> T newInstance(Class<? extends T> type, String className) throws
ClassNotFoundException,
InstantiationException,
IllegalAccessException {
    Class<?> clazz = Class.forName(className);
    Class<? extends T> targetClass = clazz.asSubclass(type);
    T result = targetClass.newInstance();
    return result;
}

Моя проблема : когда я пытаюсь получить этот класс только с частью имени (я пытаюсь получить его с помощью «InPacket1», в то время как класс называется «InPacket1Connect»), он может ' не могу найти это. Возможно ли это сделать на Java, и если да, то как? Если нет, какой метод вы рекомендуете для обработки моих сетевых пакетов?

Ответы [ 3 ]

0 голосов
/ 01 марта 2012

Альтернативным подходом было бы использование карты (или enum), которая отображает идентификатор на полное имя класса.

Извлекая материал из комментариев, убедитесь, что этот класс отображения доступен в виде jar (или может находиться в том же jar, который содержит реализации обработчиков пакетов), что и ваш jar "уровня сообщений".

0 голосов
/ 01 марта 2012

Почему вы не можете создать полное имя класса?

packet = ClassUtils.newInstance(InPacket.class, "server.client.InPacket"+id + "Connect"

Вы могли бы реализовать ту функциональность, о которой вы, похоже, просите - своего рода "нечеткое" сопоставление имени класса - написав свой собственный загрузчик классов.Загрузчик классов может искать в некоторых каталогах файлы классов, частично соответствующие типу.

Мне кажется, что это потенциально хрупкое решение, существует опасность загрузки неожиданных классов.Я предпочитаю предложение Нима явно иметь таблицу сопоставления, если вы не можете использовать генератор имени класса algorthimic.

0 голосов
/ 01 марта 2012

Вот так, может быть?

packet = ClassUtils.newInstance(InPacket.class, "server.client.InPacket"+id+"Connect");
                                                                           ^^^^^^^^^^

(но я, возможно, неправильно понял ваш вопрос)

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