이번에 연계시스템에서 받은 모듈(.jar)의 .class의 메서드를 수정할 일이 생겼다.
그래서 수정한 김에 정리해봄. ( 샘플파일은 postgresql.jar를 사용 )
오늘의 목표
postgresql.jar의 org.postgresql.copy 패키지 안의 CopyDual.class를 수정하여
getPrint()라는 메서드를 만들어 직접 호출
우선 이클립스에서 해당 경로의 CopyDual.class를 열어보면 Source not found라고 뜨며 소스를 확인 할 수 없다.
다음과 같은 순서를 통해 .class파일을 수정해보자.
1. .class파일을 .java파일로 디컴파일
2. .java파일 수정
3. .java파일을 .class파일로 컴파일
4. 수정한 .class파일로 .jar파일 재생성
1. CopyDual.class파일을 CopyDual.java파일로 디컴파일
1) .jar을 압축 풀어 해당 .class파일을 java decompiler 툴을 통해 디컴파일 * java decompiler 사용방법 링크
java decompiler 툴을 통해 디컴파일한 코드를 복사해주도록 하자.
이렇게 복사한 코드를 가지고 같은 같은 경로에 CopyDual.java파일을 생성한 뒤 붙여넣고
빌드하여 CopyDual.class파일을 생성해준다.
그런 다음 메서드를 생성해주도록 하자. 나는 아래와 같이 메서드를 생성해주었음.
2) .java파일 수정
package org.postgresql.copy;
public class CopyDual {
public void getPrint() {
System.out.println("i_love_mochi");
}
}
//기존 interface였던 CopyDual을 클래스로 변경하고 콘솔에 로그를 찍는 함수 추가함
이렇게 한후, 프로젝트를 빌드( 프로젝트 클린후 서버구동 )해주면 .class파일이 생성되는 것을 확인할 수 있다.
3) .java파일을 .class파일로 컴파일
CopyDual.java파일 우클릭 - Run AS - Run Configuration
이렇게 클래스파일 경로로 가면 클래스파일이 정상적으로 생성된 것을 확인 할 수 있다. 이제 이 클래스파일이
정상적으로 수정이 된 클래스 파일인지 확인하기 위해 다시 java decompiler를 통해 확인해보자.
확인해보니 CopyDual 클래스에 getPrint메서드가 제대로 선언된 것을 확인 할 수 있다.
4) 수정한 .class파일로 .jar파일 재생성
이렇게 수정한 클래스파일을 넣은 폴더를 다시 .jar파일로 압축한 뒤, 변경된 .jar파일을 기존의 .jar파일과
바꿔주면 된다!
기존에 있던 postgresql.jar파일 삭제후 새로 수정된 postgresql.jar파일을 추가해준다.
이제 직접 CopyDual.class안에 만든 getPrint()함수를 호출해보도록 하자.
TestJava.java를 만들어 CopyDual.class에 만든 getPrint함수를 호출하였다.