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

将具有静态属性和注释的Java类转换为Scala等效类,scala,scala-2.8,Scala,Scala 2.8,我目前正在尝试将下面的Java类“翻译”为等效的Scala类。它是JavaEE6应用程序的一部分,我需要它来使用JPA2元模型 import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.StaticMetamodel; @StaticMetamodel(Person.class) public class Person_ { public static volatile

我目前正在尝试将下面的Java类“翻译”为等效的Scala类。它是JavaEE6应用程序的一部分,我需要它来使用JPA2元模型

import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@StaticMetamodel(Person.class)
public class Person_ {
  public static volatile SingularAttribute<Person, String> name;
}
因此,现在我需要一个具有相同结构的等效Scala文件,因为JPA依赖于它,因为它通过反射解析属性,使它们在运行时可访问。所以我认为主要的问题是属性是静态的,但是注释必须在(Java)对象上(我猜) 我第一次天真地尝试创建Scala等价物如下:

@StaticMetamodel(classOf[Person])
class Person_

object Person_ {
  @volatile var name:SingularAttribute[Person, String] = _;
}
但是生成的类文件与Java类文件相差很远,因此无法工作。当试图在运行时访问属性时,例如“Person_uz.firstname”,它解析为null,我认为JPA无法对编译的类文件执行正确的反射魔法(Java变量在运行时解析为org.hibernate.ejb.metamodel.SingularAttributeImpl的实例)

现在我想知道的是,是否有可能创建Java类的Scala等价物?在我看来,这绝对不是,但可能有解决办法或其他什么(除了使用Java,但我希望我的应用程序尽可能在Scala中)


有什么想法吗?提前谢谢

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

顺便说一句,Scala中没有办法将您需要的静态方法转化为Person。我没有在Scala中使用JPA,所以我不能对此说太多。也许Scala邮件列表中的一些人可以告诉你更多


关于JPA和Scala有一个更老的说法,但我认为它已经过时。

您打算实现JPA2还是使用它?静态元模型不是由JPA2实现生成的吗?我想使用JPA2。是的,我猜元模型是由JPA2实现生成的。我几乎可以肯定,用Scala编写元模型是不可能的。当我正在写一篇关于Scala和JavaEE6的论文时,如果您能解释为什么这是不可能的,我将不胜感激。也许您应该要求对Scala->JVM编译模型进行正式描述。我不知道是否存在这样的东西(除了编译器)。夜间Scala参考手册中没有介绍。好的,谢谢。所以,如果这是一个编译模型的问题,那么我的论文将非常深入。。。我想我会写一些类似这样的东西:“在Scala中不可能创建等效的类文件,因为Scala不支持像Java中那样创建静态函数。因此,JPA在执行反射时找不到函数(我已经在Scala邮件列表中询问过了;)但也许用一种更“通用”的方式来表达我的问题会更好。没有比这里更好(而且只有一个)的答案了。是的,这篇文章有点过时了。无论如何,谢谢你的想法。
@StaticMetamodel(classOf[Person])
class Person_

object Person_ {
  @volatile var name:SingularAttribute[Person, String] = _;
}
> 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);
}