Ok. 여기 내 해결책. javaassist를 사용하여 런타임에 클래스 및 해당 Class 객체를 생성합니다. 최종 결과는 자바 소스 코드 파일에 일반 텍스트로
@OneToMany(targetEntity = com.foo.Bar.class)
될 것이기 때문에,이 생성 된 "더미 클래스"실제로 참조 된 실제 실제 클래스와 일치하지 않는 것을 중요하지 않습니다.
그래서 Guillaume이 표시된대로 주석 만들기를 조정하고 ClassNotfoundExeption
을 잡습니다.
JAnnotationUse oneToMany = field.annotate(OneToMany.class);
//...snipped...
try {
oneToMany.param("targetEntity", Class.forName(jpaProperty.getTargetEntity()));
} catch (ClassNotFoundException ex) {
try {
Class targetEntityClass = generateDummyClass(jpaProperty.getTargetEntity());
oneToMany.param("targetEntity", targetEntityClass);
} catch (CannotCompileException compileEx) {
throw ex;
}
}
}
방법 generateDummyClass
javaassist 사용하여 런타임에 클래스의 객체를 생성 : 예외 처리기에서 우리는 클래스 객체 생성 javaassist를 사용하는 generateDummyClass
메서드를 호출
private Class<?> generateDummyClass(String fullQualifedClassName)
throws IOException, CannotCompileException {
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath(new ClassClassPath(this.getClass()));
CtClass ctClass = pool.makeClass(fullQualifedClassName);
Class<?> clazz = ctClass.toClass();
return clazz;
}
을 우리는 자바 소스를 얻을 수 코드 파일 :
@OneToMany(targetEntity = org.foo.Bar.class)
private Set<Bar> bars = new HashSet<Bar>();
왜 이미 인수에 사용하는'Class.forName() '이 아닌가요? – fge
왜냐하면 클래스를로드해야하기 때문입니다. 그리고 모든 클래스가 될 수 있기 때문에 클래스 경로에 있다는 보장이 없습니다. 사용자가 클래스 경로에 병을 추가하는 방법을 이해할 필요가 없어야한다는 것을 의미하는 사용자 친화적이어야합니다. –