예,이 같은 당신이 제대로 ForwardingJavaFileManager
을 구현할 때 완전히 가능하다. 가장 중요한 두 가지 방법은 inferBinaryName()과 list()입니다. 이 두 가지를 올바르게 설정하면 컴파일러는 이전에 컴파일 한 클래스를 확인할 수 있습니다.
inferBinaryName()
클래스 'simple name을 반환해야합니다 (예를 들어, com.test.Test
에 대한 추정 바이너리 명 그냥 Test
것)을. 내가 끝에서 "된 .java"을 박리하는거야
@Override
public String inferBinaryName(Location location, JavaFileObject javaFileObject) {
if(location == StandardLocation.CLASS_PATH && javaFileObject instanceof InAppJavaFileObject) {
return StringUtils.substringBeforeLast(javaFileObject.getName(), ".java");
}
return super.inferBinaryName(location, javaFileObject);
}
참고 : 여기에 (JavaFileObject
내 서브 클래스가 InAppJavaFileObject
라고합니다) 내 구현입니다. JavaFileObject
을 만들 때 파일 이름은 ".java"로 끝나야하지만 나중에 접미사를 제거하지 않으면 컴파일러에서 클래스를 찾지 못합니다.
list()
은 좀 더 복잡합니다. 위임 파일 관리자와 잘 조심해야하기 때문입니다. 내 구현에서 나는 반복 할 수 JavaFileObject
의 내 서브 클래스에 정규화 된 클래스 이름의 맵을 유지 : 당신이 제대로 구현하는 방법이 있으면
@Override
public Iterable<JavaFileObject> list(Location action, String pkg, Set<JavaFileObject.Kind> kind, boolean recurse) throws IOException {
Iterable<JavaFileObject> superFiles = super.list(action, pkg, kind, recurse);
// see if there's anything in our cache that matches the criteria.
if(action == StandardLocation.CLASS_PATH && (kind.contains(JavaFileObject.Kind.CLASS) || kind.contains(JavaFileObject.Kind.SOURCE))) {
List<JavaFileObject> ourFiles = new ArrayList<JavaFileObject>();
for(Map.Entry<String,InAppJavaFileObject> entry : files.entrySet()) {
String className = entry.getKey();
if(className.startsWith(pkg) && ("".equals(pkg) || pkg.equals(className.substring(0, className.lastIndexOf('.'))))) {
ourFiles.add(entry.getValue());
}
}
if(ourFiles.size() > 0) {
for(JavaFileObject javaFileObject : superFiles) {
ourFiles.add(javaFileObject);
}
return ourFiles;
}
}
// nothing found in our hash map that matches the criteria... return
// whatever super came up with.
return superFiles;
}
, 나머지는 작동합니다. 즐겨!
죄송합니다. 속도가 느려지지만 게시 된 링크가 어떻게 문제를 해결하는지 알 수 없습니다. 나도 똑같은 문제를 겪었다. 클래스를 따로 컴파일 할 수 있다면 내 API가 훨씬 더 깔끔하고 관리하기 쉬워진다. 당신이 대답으로 해결책을 게시 할 수 있다면 나는 그것을 고맙게 생각할 것이다. :) – stevevls
실제로, 나는 이것을 해결했습니다. 그래서 나는 후손을 위해 대답을 게시했습니다. 큰 질문에 감사드립니다! – stevevls