자바 코드 개선

동적 컴 파일 은 자바 의 꿈 이 었 습 니 다.자바 6 버 전부터 동적 컴 파일 을 지원 하기 시 작 했 습 니 다.실행 기간 에 자바 파일 을 직접 컴 파일 하고'class'를 실행 할 수 있 으 며 관련 입 출력 을 얻 을 수 있 으 며 관련 사건 도 감청 할 수 있 습 니 다.그러나 우리 가 가장 원 하 는 것 은 코드 를 정 하고 직접 컴 파일 한 다음 에 실행 하 는 것 입 니 다.즉,공중 컴 파일 실행(on-the-fly)입 니 다.다음 코드 를 보 겠 습 니 다.

public class Client {
     public static void main(String[] args) throws Exception {
         //Java   
         String sourceStr = "public class Hello{    public String sayHello (String name) {return \"Hello,\" + name + \"!\";}}";
         //      
         String clsName = "Hello";
         //   
         String methodName = "sayHello";
         //     
         JavaCompiler cmp = ToolProvider.getSystemJavaCompiler();
         //Java       
         StandardJavaFileManager fm = cmp.getStandardFileManager(null,null,null);
         //Java    
         JavaFileObject jfo = new StringJavaObject(clsName,sourceStr);
         //    ,   javac <options>  options
         List<String> optionsList = new ArrayList<String>();
         //         ,  :    Eclipse     
         optionsList.addAll(Arrays.asList("-d","./bin"));
         //      
         List<JavaFileObject> jfos = Arrays.asList(jfo);
         //      
         JavaCompiler.CompilationTask task = cmp.getTask(null, fm, null, optionsList,null,jfos);
         //    
         if(task.call()){
             //    
             Object obj = Class.forName(clsName).newInstance();
             Class<? extends Object> cls = obj.getClass();
             //  sayHello  
             Method m = cls.getMethod(methodName, String.class);
             String str = (String) m.invoke(obj, "Dynamic Compilation");
             System.out.println(str);
        }
    }
}
//    Java  
class StringJavaObject extends SimpleJavaFileObject{
     //   
     private String content = "";
     //  Java        
     public StringJavaObject(String _javaFileName,String _content){
           super(_createStringJavaObjectUri(_javaFileName),Kind.SOURCE);
           content = _content;
     }
     //    URL    
     private static URI _createStringJavaObjectUri(String name){
        //          
        return URI.create("String:///" + name + Kind.SOURCE.extension);
     }
     //      
     @Override
     public CharSequence getCharContent(boolean ignoreEncodingErrors)
            throws IOException {
        return content;
    }
}
위의 코드 가 비교적 많 습 니 다.이것 은 동적 컴 파일 된 템 플 릿 프로그램 입 니 다.독 자 는 프로젝트 에 복사 하여 사용 할 수 있 고 코드 중의 중국어 주석 도 비교적 많 습 니 다.독자 가 알 아 볼 수 있 고 해석 이 많 지 않 을 것 이 라 고 믿 습 니 다.독 자 는 한 가지 만 알 면 현지 정적 컴 파일 이 실현 할 수 있 는 임무,예 를 들 어 컴 파일 파라미터,입 출력,오류 모니터링 등 동적 컴 파일 이 모두 실 현 될 수 있 습 니 다.
자바 의 동적 컴 파일 은 원본 에 여러 개의 경 로 를 제공 합 니 다.예 를 들 어 문자열(예 에서 문자열)일 수도 있 고 텍스트 파일 일 수도 있 으 며 컴 파일 된 바이트 파일(class 파일)일 수도 있 고 데이터베이스 에 저 장 된 명문 코드 나 바이트 코드 일 수도 있다.한 마디 로 자바 규범 에 부합 되 는 것 이 라면 모두 운행 기 에 동적 으로 불 러 올 수 있다.그 실현 방식 은 자바 FileObject 인 터 페 이 스 를 실현 하고 getCharContent,openInputStream,openOutputStream 을 다시 쓰 거나 JDK 가 이미 제공 한 두 개의 Simple 자바 FileObject,ForwardingJavaFileObject 를 실현 하 는 것 이다.구체 적 인 코드 는 상기 예 를 참고 할 수 있다.
동적 컴 파일 링 은 좋 은 도구 이지 만 컴 파일 과정 을 더욱 자 유 롭 게 제어 할 수 있 지만 제 가 현재 접 하고 있 는 프로젝트 에서 사용 하 는 것 이 비교적 적 습 니 다.이 유 는 간단 합 니 다.정적 컴 파일 은 대부분의 작업,심지어 모든 작업 을 처리 할 수 있 습 니 다.동적 컴 파일 이 필요 하 더 라 도 Jruby,Groovy 등 빈 틈 없 는 스 크 립 트 언어 등 좋 은 대체 방안 이 있 습 니 다.
또한,우 리 는 동적 컴 파일 을 사용 할 때 다음 과 같은 몇 가 지 를 주의해 야 한다.
(1)프레임 에서 조심스럽게 사용
예 를 들 어 Struts 에서 동적 컴 파일 을 사용 하고 동적 으로 클래스 를 실현 하려 면 Action Support 를 계승 하면 Action 이 되 기 를 바 랍 니 다.할 수 있 지만 debug 는 어렵 습 니 다.그리고 스프링 에 동적 클래스 를 써 서 스프링 용기 에 동적 으로 주입 하려 면 많은 노력 이 필요 하 다.
(2)고성능 을 요구 하 는 항목 에서 사용 하지 마 십시오.
동적 컴 파일 은 컴 파일 과정 이 필요 하기 때문에 정적 컴 파일 에 비해 실행 절차 가 하나 더 많 기 때문에 고성능 프로젝트 에서 동적 컴 파일 을 사용 하지 마 십시오.그러나 도구 류 프로젝트 라면 그 우수 성 을 잘 발휘 할 수 있다.예 를 들 어 Eclipse 도구 에 플러그 인 을 쓰 면 동적 컴 파일 을 잘 사용 할 수 있 고 다시 시작 하지 않 아 도 실행,디 버 깅 기능 을 실현 할 수 있어 매우 편리 하 다.
(3)동적 컴 파일 은 안전 문 제 를 고려 해 야 한다.
웹 인터페이스 에 자바 파일 을 올 리 고 실행 할 수 있 는 기능 을 제공 했다 면"내 기 계 는 비밀번호 가 없 으 니 모두 나의 프라이버시 를 보 러 오 세 요"라 고 말 하 는 것 과 같 습 니 다.이것 은 매우 전형 적 인 구멍 입 니 다.악성 자바 프로그램 을 올 리 기만 하면 모든 안전 작업 을 하루아침 에 망 칠 수 있 습 니 다.
(4)동적 컴 파일 과정 기록
원본 파일,목표 파일,컴 파일 과정,실행 과정 등 로 그 를 기록 하 는 것 을 권장 합 니 다.진단 뿐만 아니 라 안전 과 감 사 를 위해 자바 프로젝트 에 있어 공중 컴 파일 과 운영 은 안심 할 수 없 으 며 이러한 근 거 를 남 겨 두 면 프로그램 을 최적화 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기