기존에 글에서 작성한 클래스 파일 생성 메소드를 통해 실제 파일을 동작 시켜 보겠다.
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 |