2016-06-13 3 views
0

Это странный вопрос. У меня есть метод, который заполняет список набором классов с использованием java-отражения.Java: Является ли отражение каждый раз на каждом компьютере?

import org.reflections.Reflections; 
    ... 
    Reflections reflections = new Reflections("network.packet"); 
    Class<?>[] packets = new Class<?>[256]; 
    for (Class<?> c : reflections.getSubTypesOf(Packet.class)) 
    { 
     try { 
      byte opcode = ((Packet)c.newInstance()).getOpcode(); 
      packets[opcode] = c; 
     } catch (InstantiationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

GetOpcode возвращает байт, регистрирующий байт в пакете. Мне интересно, могу ли я сделать код более дружественным API, предлагая автоматическое решение для сопоставления опкодов. В настоящее время у меня есть в классах, которые расширяют силу пакета, вызывает супер-конструктор с байтом, регистрирующим код операции.

setOpcode(byte num) 

, который устанавливает код операции для этого класса.

Моя проблема в том, могу ли я доверять org.reflection, чтобы каждый раз запускать каждый раз на каждой машине, чтобы вычислять коды, а не заставлять их жестко закодировать, и заставить пользователей API не наступать на уже существующие коды.

Итак, кто-нибудь знает?

+0

@mjn reflections-0.9.10 –

ответ

1

org.reflections не вычисляет коды - вы просто используете его для перебора по подтипам Packet, которые предоставляют код.

Пока все ваши Packet расширения находятся на пути к классу (и все они предоставляют уникальный код, который будет вписываться в этот массив), тогда вы в порядке.

Что касается «лучший способ» - вы могли бы рассмотреть механизм «регистрации» (то есть: толчок классы пакетов в реестре), а механизм «открытия» (то есть: тянуть классы пакетов из путь класса), который вы используете сейчас - лучше ли это зависит от вашего конечного варианта использования.

+0

Я знаю, что он не вычисляет, что я говорю, когда я делаю отражение, чтобы получить все классы в одном пространстве имен. Wether или нет, он делает то же самое каждый раз. EX: Я получаю пакет1, пакет2, пакет3. если я перехожу на другую машину, он может загружаться по-другому и возвращать пакет2, пакет1, пакет3. –

+0

Я был бы очень подозрителен в зависимости от этого поведения даже для одной машины. –

+0

О, классы могут быть абсолютно в любом порядке (они могут даже загружаться в другом порядке и обычно хранятся внутри класса загрузчиком класса в HashMap, что не гарантирует порядок). __Вы не должны зависеть от порядка загрузки классов, когда-либо. Ваш код показывает, используя код операции как индекс для массива, поэтому он уже обрабатывает результаты заказа. – Krease

Смежные вопросы