Как отправить класс по телеграфу - PullRequest
2 голосов
/ 03 июня 2009

У меня следующая проблема: я хочу отправить тип (java.lang.Class) по проводам и «определить» класс на другой стороне.

Я пытался так:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(MyClass.class);

и на принимающей стороне:

ByteArrayInputStream bis = new ByteArrayInputStream(request.getBytes());
ObjectInputStream ois = new ObjectInputStream(bis);
Class c = (Class) ois.readObject(); // ClassNotFoundException

так что, очевидно, мне нужно отправить необработанный байт-код класса и сделать

ClassLoader.defineClass(bytes, ..

но, к сожалению, я не вижу, как я могу получить байт-код загруженного класса. Я ищу что-то вроде:

byte[] byteCode = MyClass.class.toByteArray();

Возможно ли это даже со стандартным JDK или есть какая-нибудь небольшая библиотека, которая может это сделать?

Ответы [ 4 ]

5 голосов
/ 03 июня 2009

Я не думаю, что вы хотите, возможно в полной общности. Определение класса из его байт-кода необратимо. Однако вы должны иметь возможность непосредственно читать файл байт-кода (при условии, что это URLClassLoader):

MyClass.class.getResourceAsStream("Myclass.class")

Кроме того, вы можете просто сделать файлы классов доступными через HTTP и напрямую использовать URLClassLoader на принимающей стороне.

1 голос
/ 03 июня 2009

Вы не можете сделать это из памяти. У вас должны быть байт-коды, определяющие класс, который для большинства классов можно найти, задав JVM. Этот код из http://www.exampledepot.com/egs/java.lang/ClassOrigin.html должен помочь вам начать:

// Get the location of this class
Class cls = this.getClass();
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation();  // file:/c:/almanac14/examples/
0 голосов
/ 03 июня 2009

Вы можете написать свой собственный метод сериализации.

так

public byte[] Serialize()
{

// serialize each field in turn here.

return data;
}


public void Deserialize(byte[] data)
{

// deserialize data in the same order it was serialized.

}

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

Мы используем объекты потока памяти для записи каждого поля данных и каскадной записи сложных объектов путем реализации изериализуемого интерфейса (который может отсутствовать в Java, но это простой интерфейс для реализации самостоятельно).

Мы используем ту же DLL на корпоративном сервере, что и на клиенте.

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

0 голосов
/ 03 июня 2009

Вы должны проверить интерфейс сериализации Java

редактировать:

Я перечитал ваш пост, а вы говорите об определении класса с другой стороны. Это заставляет меня думать, что вы пытаетесь распределить объекты по сети .

Кроме того, если и ваш сервер, и клиент используют один и тот же интерфейс, вы можете просто создавать объекты с помощью java отражение

...