나는 지난 이틀 동안 최대 절전 모드의 프록시 부분을 보았다. 첫 번째 반응은 기본 계층이 반사를 사용하고 사용자 엔티티에 대한 프록시 클래스를 생성했다는 것이었다. 나중에, 나는 반사가 새로운 클래스를 생성 할 능력이 없다는 것을 깨달았으므로 자연스럽게 javassist (다운로드 주소)를 발견했습니다.
온라인으로 검색된 대부분의 자습서는 Javassist API에 설명되어 있지만 결국에는 로딩 프로세스가 없습니다. 저자가 클래스로드에 대한 이러한 자습서를 모방하면로드 된 결과는 원래 클래스이며 바이트 코드 수정 된 내용이 없습니다.
일부 탐색 후, 저자는 인터넷의 대부분의 자습서의 마지막 단계가 바이트 코드를 저장하는 데 사용되는 것을 발견했습니다. 기능 구조를 확인한 후 문자열 유형 오버로드도 있음을 발견했습니다. Eclipse에서 바이트 코드의 루트 위치는 ".//"이지만 ".//bin"이 아니며, WriteFile의 다른 과부하는 바이트 코드의 루트 위치를 지정하는 매개 변수 일 가능성이 높습니다. 약간의 변화 후, 나는 그것이 사실이라는 것을 알았습니다.
다음은 데모 코드입니다.
이것이 저자 프로젝트의 구조입니다.
editable.java : package com.thrblock.javassist; 공개 클래스 편집 가능한 {public void showinfo () {System.out.println ( "InfodeFault!"); }} main.java : package com.thrblock.javassist; import java.io.ioexception; import javassist.cannotcompileException; import javassist.classpool; import javassist.ctclass; import javassist.ctmethod; import javassist.ctnewmethod; probouldexemention; NOTFOUNDEXMENTE; main (string [] args) {classpool pool = classpool.getDefault (); try {pool.insertclasspath ( ".// bin"); // 루트 경로를 설정합니다. (여기서 설정된 루트 경로는 분명히 WriteFile에 의해 사용되지 않습니다) CTClass CC = Pool.MakeClass ( "com.thrblock.javassist.editableChanged"); // Hibernate 프록시 모드를 시뮬레이션하면 새로운 클래스 CC를 만듭니다 (Pool.setSuperClass ( "com.thrblock.javassist.ediblice"); // ctnewMethod.make ( "public void showinfo () {super.showinfo (); System.out.println (/"CustominSerthaha!/");}", CC); // 메소드를 추가하고 부모 클래스의 메소드를 무시한다는 점에 유의하십시오. cc.addmethod (cm); cc.writefile ( ".// bin"); // 이것은 더 중요합니다. NULL 매개 변수의 결과는 Eclipse Bytecode 루트 경로에 저장되지 않았다는 것입니다. } catch (notFoundException | cancleCompileException | ioException e) {e.printStackTrace ();} try {class <?> cl = class.forname ( "com.thrblock.javassist.editableChanged"); // hoad prinpulation (cl.newinstance); 최대 절전 모드. ed.showinfo (); // 메소드를 호출합니다. } catch (classNotFoundException | InstantiationException | 불법 행위 exception e) {e.printstacktrace ();}}}인쇄 결과 :
Infodefault!
CustomInserthaha!
기타 노트 :
클래스를 생성 했으므로 클래스 이름이 원래 클래스 이름과 동일하면 클래스 파일을 덮어 씁니다. 그러나 수정 전에 클래스가 JVM에 의해로드 된 경우 수정 된 부분이 적용되지 않으며 JVM을 다시 시작해야합니다.
요약
위는 Eclipse에서 Javassist의 올바른 사용 방법에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!