我目前正在尝试将以下Java类“转换”为等效的Scala类。它是JavaEE6应用程序的一部分,我需要它来使用JPA2 MetaModel。
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@StaticMetamodel(Person.class)
public class Person_ {
public static volatile SingularAttribute<Person, String> name;
}
对已编译的类文件进行反汇编会显示已编译文件的以下信息:
> javap Person_.class :
public class model.Person_ extends java.lang.Object{
public static volatile javax.persistence.metamodel.SingularAttribute name;
public model.Person_();
}
所以现在我需要一个具有相同结构的等效Scala文件,因为JPA依赖于它,因为它通过反射解析属性以使它们在运行时可访问。所以我认为的主要问题是属性是静态的,但是注释必须在(Java)对象上(我猜) 我第一次创建Scala等效项的天真尝试如下:
@StaticMetamodel(classOf[Person])
class Person_
object Person_ {
@volatile var name:SingularAttribute[Person, String] = _;
}
但是生成的类文件远离Java文件,所以它不起作用。尝试在运行时访问属性时,例如“Person_.firstname”,它解析为null,我认为JPA无法在编译的类文件上做正确的反射魔术(Java变体在运行时解析为org.hibernate.ejb.metamodel.SingularAttributeImpl的实例)。
> javap Person_.class :
public class model.Person_ extends java.lang.Object implements scala.ScalaObject{
public static final void name_$eq(javax.persistence.metamodel.SingularAttribute);
public static final javax.persistence.metamodel.SingularAttribute name();
public model.Person_();
}
> javap Person_$.class :
public final class model.Person__$ extends java.lang.Object implements scala.ScalaObject
public static final model.Person__$ MODULE$;
public static {};
public javax.persistence.metamodel.SingularAttribute name();
public void name_$eq(javax.persistence.metamodel.SingularAttribute);
}
所以现在我想知道的是,是否可以创建Scala等效的Java类?在我看来,它绝对不是,但也许有一个解决方法或其他东西(除了使用Java,但我希望我的应用程序尽可能在Scala中)
任何想法,任何人?提前致谢!
答案 0 :(得分:1)
正如您所看到的,Scala伴随对象按照单例模式编译为单独的类(唯一的实例是在MODULE $中保存)。这是必要的,因为它们也可以从其他类继承。
AFAIK Scala无法将所需的静态方法导入Person。我没有在Scala上使用JPA,所以我不能多说这个。可能有一些Scala邮件列表中的人可以告诉你更多信息。
关于JPA和Scala有一个较旧的article,但我认为它已经过时了。