gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:15:29 26 4
gpt4 key购买 nike

我目前正在尝试将以下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依赖于它,因为它通过反射来解析属性以使其在运行时可访问。所以我认为主要的问题是属性是静态的,但是Annotation必须在(Java)Object上(我猜是)
我第一次天真的尝试创建一个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);
}

所以现在我想知道的是,是否有可能创建与Java类等效的Scala?在我看来,这绝对不是,但是也许有解决方法或某些办法(除了使用Java,但我希望我的应用程序尽可能在Scala中)

有什么想法吗?提前致谢!

最佳答案

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

AFAIK在Scala中无法将所需的静态方法转换为Person。我没有在Scala中使用JPA,所以我对此不多说。 Scala邮件列表之一中的某些人可能会告诉您更多信息。

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

关于scala - 将具有静态属性和注释的Java类转换为等效的Scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3032474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com