본문 바로가기
JAVA/Java Study

자바 동적 컴파일

by 늑인 2023. 9. 18.

해당 방법은 자바 컴파일러(javac)를 사용하여 클래스 파일을 생성한 예제이다.

 

 

1. 프로세스를 통한 자바에서 컴파일러 호출 메서드 부분. 

 public String execute(String command) {
        StringBuffer output = new StringBuffer();
        Process process = null;
        BufferedReader bufferReader = null;
        Runtime runtime = Runtime.getRuntime();
        String osName = System.getProperty("os.name");

        // 윈도우일 경우
        if (osName.indexOf("Windows") > -1) {
            command = "cmd /c " + command;
        }

        try {
            process = runtime.exec(command);
            Scanner s = new Scanner(process.getInputStream(), "euc-kr");
            while (s.hasNextLine() == true) {
                //표준출력으로 출력
                output.append(s.nextLine() + System.getProperty("line.separator"));
            }
            s = new Scanner(process.getErrorStream(), "euc-kr");
            while (s.hasNextLine() == true) {
                // 에러 출력
                output.append(s.nextLine() + System.getProperty("line.separator"));
            }
        } catch (IOException e) {
            output.append("IOException : " + e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                process.destroy();
                if (bufferReader != null) bufferReader.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
//        System.out.println("this end");
        return output.toString();
    }

 

2. 클래스 이름과, 클래스 내용을 메소드에 담아서 보냄.

    public String compile(String clsName, String clsStr) {
        // 클래스 이름과, 자바 파일 내용 포함.
        // 자바 파일 생성.
        File file = wirteClass(clsName, clsStr);
        
        //자바 파일 컴파일 명령어 
        String command = "javac -encoding UTF-8 dynamic/" + clsName + ".java";
        String result = execute(command);
        // 임시 생성된 자바 파일 삭제.
        file.delete();
        return result;
    }
    
    public File wirteClass(String clsName, String stringClass) {
        String folder = System.getProperty("user.dir") + "\\dynamic";
        // 임의의 패키지명 부여
        return write(folder, clsName + ".java", "package dynamic; " + stringClass);
    }

    private File write(String folderName, String fileName, String result) {
        File folder = new File(folderName);
        if (!folder.exists()) folder.mkdirs();
        FileWriter fw;
        try {
            File file = new File(folderName, fileName);
            fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(result);
            bw.close();
            return file;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

다음 글에서 동적 컴파일 된 클래스를 호출하는 예제를 확인해 보겠다.

'JAVA > Java Study' 카테고리의 다른 글

[Java] 크롤링과 API 차이  (0) 2023.10.23
[Java] 크롤링 1  (0) 2023.10.19
[Java] runnable.jar 를 실행시켜 보자  (0) 2023.09.26
[Java] 자바 동적 컴파일3  (0) 2023.09.26
자바 동적 컴파일2  (0) 2023.09.18