2009-06-02 3 views
2

다음과 같은 문제가 있습니다. 와이어를 통해 유형 (java.lang.Class)을 보내고 다른 쪽 클래스를 '정의'합니다. 클래스를 와이어를 통해 보내는 방법

은 그 같은 시도 : 그래서 분명히 내가 클래스의 원시 바이트 코드를 전송하고

ClassLoader.defineClass(bytes, .. 
을 할 필요가

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

:

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

과 수신 측에

하지만 불행히도로드 된 클래스의 bytcode를 검색하는 방법을 알 수 없습니다. 내가 좋아하는 뭔가를 찾고 있어요 :

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

표준 JDK이 가능하다조차 또는 작은 LIB는 거기 밖으로 그렇게 할 수 있습니까?

+1

RMI를 재 작성하려는 것처럼 들립니다. –

답변

5

나는 당신이 원하는 것이 완전한 보편성에서 가능하다고 생각하지 않습니다. 바이트 코드로부터 클래스를 정의하는 동작은 되돌릴 수 없습니다.

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

또는, 당신은 단지 HTTP를 통해 액세스 할 수있는 클래스 파일을 만들 수와 직접 URLClassLoader에를 사용 : 당신이 할 수있을 것입니다 무엇, 그러나, 직접 (그것이 URLClassLoader 있다고 가정) 바이트 코드 파일을 읽을 수있다 수신 측.

+1

.class 파일의 내용을 유선 위로 가져 와서 파일 또는 메모리에서 다시 구성해야하고 클래스 로더가 해당 파일을로드해야한다고 생각합니다. .class 파일을 파일로 재구성하면 URLClassLoader를 사용할 수 있습니다. 메모리에서 다시 구성하려면 자체 클래스 로더를 정의해야합니다. – Jared

+1

URLClassLoader를 사용하기 위해 URL을 "재구성"할 필요는 없습니다. 그것은 아무것도 * URL * ClassLoader 이름이 아니에요 - 그것은 행복하게 HTTP URL을하고 모든 노력 자체를 할 것입니다. 그것은 애플릿과 함께 작동하는 방법입니다. –

0

당신은 java serialization interface

편집을 확인해야합니다 :

난 당신의 게시물을 다시 읽고 당신이 다른 쪽의 클래스를 정의에 대해 얘기하고. 이것은 당신이 성취하고자하는 것이 distribute objects across the network라고 생각하게합니다. 모두 서버와 클라이언트 주 동일한 인터페이스, 당신은 단순히 java reflection

+1

클래스의 인스턴스가 아닌 클래스에서 클래스 DEFINITION을 가져와야하는 것처럼 들립니다. RMI와 같은 기술을 사용하거나 리플렉션을 사용하는 경우에도 클래스 로더에 DEFINITION 클래스를 사용할 수있는 것은 여전히 ​​전제 조건입니다. – Jared

+0

글쎄, 그렇긴하지만 클래스 로더는 바이트 코드를 유선으로로드 할 수있다. –

-3

를 통해 개체를 만들 수 있습니다 경우

또한, 당신은 당신의 자신의 직렬화 방법을 작성할 수 있습니다.

그렇게

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. 

} 

이것은 우리가 직렬화 닷넷에 구현하는 방법이다. 이 방법의 핵심은 직렬화에 대한 완전한 책임을 부여한다는 것입니다. 이 유형의 통신 버전을 사용하지 않을 경우 오래 동안 기다릴 수도 있지만 제품이 늘어남에 따라 여러 버전의 제품에 적용 할 수있는 몇 가지 신뢰할 수있는 방법 중 하나입니다.

메모리 스트림 객체를 사용하여 각 데이터 필드를 작성하고 직렬화 가능 인터페이스 (java에는 존재하지 않지만 자신을 구현하는 간단한 인터페이스)를 구현하여 복잡한 객체의 직렬 쓰기를 수행합니다.

우리는 클라이언트에서와 마찬가지로 기업 서버에서 동일한 dll을 사용합니다.

직렬화는 플랫폼에 관계없이 문제가됩니다.

1

메모리에서이 작업을 수행 할 수 없습니다. 클래스를 정의하는 바이트 코드가 있어야합니다. 대부분의 클래스는 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/ 
관련 문제