行。这是我的解决方案。使用 javaassist 在运行时生成类和相应的 Class 对象。由于最终结果将是
@OneToMany(targetEntity = com.foo.Bar.class)
作为java源代码文件中的普通文本,这个生成的“虚拟类”实际上并不等同于被引用的真实类。
因此,我们按照 Guillaume 的指示调整注释的创建并捕获ClassNotfoundExeption
. 在异常处理程序中,我们调用generateDummyClass
使用 javaassist 创建 Class 对象的方法:
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 在运行时创建类对象的方法:
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;
}
我们得到一个java源代码文件:
@OneToMany(targetEntity = org.foo.Bar.class)
private Set<Bar> bars = new HashSet<Bar>();