자바 코드 개선
4689 단어 자바 동적 컴 파일
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)동적 컴 파일 과정 기록
원본 파일,목표 파일,컴 파일 과정,실행 과정 등 로 그 를 기록 하 는 것 을 권장 합 니 다.진단 뿐만 아니 라 안전 과 감 사 를 위해 자바 프로젝트 에 있어 공중 컴 파일 과 운영 은 안심 할 수 없 으 며 이러한 근 거 를 남 겨 두 면 프로그램 을 최적화 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 코드 개선자바 의 동적 컴 파일 은 원본 에 여러 개의 경 로 를 제공 합 니 다.예 를 들 어 문자열(예 에서 문자열)일 수도 있 고 텍스트 파일 일 수도 있 으 며 컴 파일 된 바이트 파일(class 파일)일 수도 있 고...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.