2015-06-10 2 views
1

Для моего варианта использования я хочу передать класс (а не объект, фактический файл класса) через соединение Socket, а затем загрузить этот класс на принимающей стороне.ClassLoader: Обработка класса как ресурса - безопасная или детальность реализации?

Класс включен нормально в проект (на отправляющем конце), поэтому его где-то на пути к классу.

У меня есть весь код работает, но на самом деле получить файл класса из пути к классам, мне пришлось прибегнуть к несколько странно плохо обращались класс как ресурс (код раздели до существенной части):

public class ClassTransport { 

    public byte[] data; 
    public String qualifiedName; 

    public static ClassTransport create(Class<?> theClass) throws Exception { 
     ClassTransport result = new ClassTransport(); 
     result.qualifiedName = theClass.getName(); 
     // brute force derive the class file name 
     String classResourceName = theClass.getName().replace('.', '/') + ".class";    

     ClassLoader cl = theClass.getClassLoader(); 
     try (InputStream in = cl.getResourceAsStream(classResourceName)) { 
      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      int b; 
      while ((b = in.read()) >= 0) { 
       out.write(b); 
      } 
      out.close(); 
      result.data = out.toByteArray(); 
     } 
     return result;  
    } 

} 

Это работает, но это на самом деле безопасно, чтобы сделать это, или это нарушает какие-либо технические характеристики - в частности, каковы possibilites, где это может терпят неудачу, чтобы получить класс в будущем JRE релизы или на конкретной платформе?

ответ

1

Короткий ответ: это, наверное, хорошо.

Более длинный ответ: это не гарантируется, потому что ничто в JLS не гарантирует, что классы в пакетах организованы как файлы в каталогах.

Соответствующий раздел JLS является 7.2. Host Support for Packages:

В простых реализаций Java SE платформы, пакеты и единицы компиляции могут храниться в локальной файловой системе. Другие реализации могут хранить их с использованием распределенной файловой системы или некоторой базы данных.

Если хост-система хранит пакеты и единицы компиляции в базе данных, база данных не должна налагать дополнительные ограничения (§7.6) на блоки компиляции, допустимые в реализациях на основе файлов.

Суть в том, что путь к классу, теоретически, может быть чем-то вроде базы данных, а не файловой системы. Поэтому, хотя ваш подход не нарушает любые технические характеристики, он также не является поддерживается по любой спецификации. Я не могу найти какую-либо систему, если это так, так что вы, вероятно, , вероятно, нормально, если в большинстве случаев файловая система.

Это также обсуждалось в this Вопрос StackOverflow.

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