В настоящее время я пытаюсь "перевести" следующий класс 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;
}
Разборка скомпилированного файла класса выявляет следующую информацию для скомпилированного файла:
> 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", он разрешается до нуля, я думаю, что 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, где это возможно)
Есть идеи, кто-нибудь? Заранее спасибо!