클래스 로더가 주어진 클래스의 바이트 배열을 받아 들여 Class<?>
을 반환한다고 받아 들일 때 역순으로 할 수 있는지, 즉 Class<?>
을 전달하고 바이트 배열을 가져올 수 있는지 궁금합니다.주어진 클래스 (java.lang.Object)를 바이트 배열로 변환합니다. 가능한가?
직렬화에 대해 말하는 것이 아닙니다.
클래스 로더가 주어진 클래스의 바이트 배열을 받아 들여 Class<?>
을 반환한다고 받아 들일 때 역순으로 할 수 있는지, 즉 Class<?>
을 전달하고 바이트 배열을 가져올 수 있는지 궁금합니다.주어진 클래스 (java.lang.Object)를 바이트 배열로 변환합니다. 가능한가?
직렬화에 대해 말하는 것이 아닙니다.
ClassLoader.getResourceAsInputStream()을 사용할 수 있지만로드 된 것과 동일한 바이트가 보장됩니다. 로드 된 실제 바이트가 어디에도 저장되지 않는다고 생각합니다.
내가 아는 표준 방법이 없습니다. 그러나 당신은 자신의 위임 클래스 로더를 구현하여 이름과 바이트 코드의 관점에서로드 된 클래스를 추적 할 수 있습니다.
당신의 사례는? - 원격 응용 프로그램으로 코드 전송?
ClassLoader
구현은 지원하는 Java 언어 사양 버전에 대한 클래스 표현을 변경해야합니다. 따라서 바이트 배열을 취하여 이것을 Class
객체로 변환하거나 일부 ClassLoader를 확장하는 로직을 포함해야합니다. 그러나 Java가 정의하는 추상 ClassLoader
클래스에는 클래스에서 byte []를 반환 할 수있는 메서드가 없습니다. 일부 구현체 (예 : 부트 스트랩, 시스템 또는 다른 클래스 로더)가있을 수 있지만 구현에 고유 한 것이고 의존할만한 것이 아닙니다.
당신이 이런 종류의 기능이 필요한 경우, 하나의 방법은 나중에 검색 할 수 있도록 입력 바이트 배열이 Class
객체에 매핑되는 방식에 defineClass
방법을 자신의 ClassLoader
구현을 작성하고 무시하는 것입니다해야 할 일 .
컴파일러가 소스 코드를 클래스 파일 (기본적으로 바이트 [])로 바꾸고 클래스 로더가 클래스 파일을 Class
개체로 변환하기 때문에 Class
에서 byte []로 바로 이동하는 데 필요한 항목이 체인에 없습니다. 하지만 바이트 코드 위빙 (weaving), 런타임 바이트 코드 생성 (runtime byte code generation) 등을하는 것들을 사용하면 이것을 할 수있는 무언가를 발견 할 수 있습니다.
여기 BCEL으로 시도하는 뭔가 : 나는 당신의 질문을 읽고에 대한 답변을하기 전에 몰랐
JavaClass clazz = Repository.lookupClass("foo.bar.YourClass");
byte[] bytes = clazz.getBytes();
,하지만 그들은 Java class file format 지원하기 때문에, 나는 다음과 같은 라이브러리를 확인해야합니다 알고 :
을위의 방법으로 문제가 해결되지 않으면이 라이브러리에서 다른 것을 찾아보십시오.