런타임 컴파일을 위해 컨텍스트 클래스 로더의 클래스 경로를 설정하는 방법은 무엇입니까?

루카스 에더

weblogic 10.3 서버 내에서 런타임에 새 클래스를 컴파일하고로드하고 싶습니다. 클래스 로딩은 다소 간단 해 보입니다.

class ClassFileManager 
extends ForwardingJavaFileManager<StandardJavaFileManager> {

  Map<String, JavaClassObject> classes = new HashMap<String, JavaClassObject>();

  public ClassFileManager(StandardJavaFileManager standardManager) {
    super(standardManager);
  }

  @Override
  public ClassLoader getClassLoader(Location location) {
    return new SecureClassLoader(currentThread().getContextClassLoader()) {
      @Override
      protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] b = classes.get(name).getBytes();
        return super.defineClass(name, b, 0, b.length);
      }
    };
  }

  @Override
  public JavaFileObject getJavaFileForOutput(
      Location location, String className, Kind kind, FileObject sibling)
      throws IOException {
    JavaClassObject result = new JavaClassObject(className, kind);
    classes.put(className, result);
    return result;
  }
}

클래스 로딩을 수행하는 가장 간단한 방법은 a를 초기화 하고 부모로 SecureClassLoader사용하는 것 같습니다 contextClassLoader.

그러나 -classpathJDK의 런타임 컴파일러에 대한 옵션을 설정할 때 문자열 형식에서 "컨텍스트 클래스 경로"를 찾을 수없는 것 같습니다. 다음은 "충분히 잘 작동하는 " 약간의 해킹입니다 .

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
ClassFileManager fileManager = 
    new ClassFileManager(compiler.getStandardFileManager(null, null, null));
List<String> options = new ArrayList<String>();
options.add("-classpath");
options.add(System.getProperty("java.class.path") + ";" +
    getClass().getProtectionDomain()
              .getCodeSource().getLocation()
              .toURI().toString()
              .replace("file:/", "").replace("/", "\\"));

그러나 컨텍스트 클래스 로더의 전체 클래스 경로를 생성하지는 않습니다. 어떻게하면 안정적으로 할 수 있습니까? 할 수 있습니까?

Anttix

WebLogic 10.3.6은 상당히 복잡한 ClassLoader구현을 가지고 있습니다. 다행히 웹 애플리케이션에 사용되는 클래스 로더는 getClassPath메소드를 노출합니다 .

ClassLoader cl = Thread.currentThread().getContextClassLoader();
String classPath = ((weblogic.utils.classloaders.GenericClassLoader)cl).getClassPath();

// Once we have a classpath it's standard procedure
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager sfm = compiler.getStandardFileManager(null, null, null);
List<String> optionList = new ArrayList<String>();
optionList.addAll(Arrays.asList("-classpath", classPath));
compiler.getTask(null, sfm, null, optionList, null, sources).call();

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관