将具有静态属性的Java类和Annotation转换为Scala等效项

时间:2010-06-13 13:57:08

标签: scala scala-2.8

我目前正在尝试将以下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中)

任何想法,任何人?提前致谢!

1 个答案:

答案 0 :(得分:1)

正如您所看到的,Scala伴随对象按照单例模式编译为单独的类(唯一的实例是在MODULE $中保存)。这是必要的,因为它们也可以从其他类继承。

AFAIK Scala无法将所需的静态方法导入Person。我没有在Scala上使用JPA,所以我不能多说这个。可能有一些Scala邮件列表中的人可以告诉你更多信息。

关于JPA和Scala有一个较旧的article,但我认为它已经过时了。