본문 바로가기
JAVA/Java Study

자바 동적 컴파일2

by 늑인 2023. 9. 18.

기존에 글에서 작성한 클래스 파일 생성 메소드를 통해 실제 파일을 동작 시켜 보겠다.

 

1. 원하는 자바 파일 내용을 입력. 

    public String getJava(){
        String javaText =
                "public class Test {\n" +
                        "    public static void main(String[] args) {\n" +
                        "        int arr[] = new int[10];\n" +
                        "        for(int i=0; i<10; i++){\n" +
                        "            arr[i] = i;\n" +
                        "        }\n" +
                        "        int sum=0;   " +
                        "        for(int i=0; i<10; i++){\n" +
                        "            sum += arr[i];\n" +
                        "        }\n" +
                        "        System.out.println(sum);\n" +
                        "    }\n" +
                        "}\n";
        return javaText;
    }

 

2.기존에 만들어둔 자바 컴파일러를 이용해 호출하는 예제.

   컴파일시 에러가 발생하면 컴파일 자체에서 에러 메세지가 생성됨으로 에러가 있는지 파악 하기 위해 검사 진행. 

        String clasName = "Test";
        String error = compile("Test",getJava());
        //error
        if (!error.trim().equals("")) {
            System.out.println(error);
        }

 

3. 컴파일로 생성된 클래스 파일을 호출.

        String folder = System.getProperty("user.dir") + "\\dynamic";

        File file = new File(folder, clasName + ".class");
        byte[] classByte =  classByte = Files.readAllBytes(file.toPath());
        file.delete();

 

4. 클래스 파일로 생성된 값을 클래스 로더를 통해 호출

public class FileClassLoader extends ClassLoader
{
    public Class findClass(byte[] classByte, String name) throws ClassNotFoundException
    {
        return defineClass(name, classByte, 0, classByte.length);d
    }
}
	FileClassLoader fc = new FileClassLoader();
	Class dynamic = fc.findClass(classByte, "dynamic." + clasName);

 

5. 클래스 로더로 호출된 클래스를 인보크 메소드를 통해 메인 메소드 실행.

    인보크 와 관련하여 궁금한점이 있다면 자바 리플렉션에 관하여 한번 찾아보면 좋은 공부가 될것

     Object obj =  dynamic.newInstance();
     Method main = dynamic.getMethod("main", String[].class);
     String[] params = null;
     main.invoke(obj, (Object) params);

6. 다음은 해당 동적 자바 소스를 이용해서 실행시킨 내용.

'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
자바 동적 컴파일  (0) 2023.09.18