2012-08-07 4 views
2

스칼라에서 Java 라이브러리 (JOhm)를 사용하려고하는데 lib가 field.isAnnotationPresent(Id.class) 같은 스칼라 클래스 필드의 주석을 읽으려고 할 때 오류가 있음을 알게되었습니다. 스칼라 클래스 필드의 getAnnotations

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface Id { 

} 

그래서 그들은 런타임에 사용할 수 있어야합니다 :

주석은 자바에 정의되어 있습니다. 그러나, 나는 시도 :

scala> import redis.clients.johm._ 
import redis.clients.johm._ 

scala> class myClass(@Id var id: java.lang.Long) 
defined class myClass 

scala> new myClass(id = null) 
res0: myClass = [email protected] 

scala> res0.getClass.getDeclaredFields 
res1: Array[java.lang.reflect.Field] = Array(private java.lang.Long myClass.id) 

scala> res0.getClass.getDeclaredFields.map(_.getAnnotations) 
res2: Array[Array[java.lang.annotation.Annotation]] = Array(Array()) 

가 그럼 난 필드 (감사 ... 사용자에 유래하는) 얻을 관리하지만 난 여전히 주석에 액세스 할 수 없습니다. 나는 무엇을 잘못 했는가?

+1

정확히 주석을 넣어하는 스칼라 말할 메타 주석이 있습니다 http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/index.html# scala.annotation.meta.package – soc

답변

4

reference provided의 'soc'덕분에 "기본적으로 (val-, var- 또는 plain) 생성자 매개 변수의 주석은 매개 변수로 끝납니다 ...".

해당 주석은 런타임 유지와 함께 FIELD 요소에 대해 정의되며 스칼라 생성자 인수 (PARAMETER)에 적용됩니다.

최근 스칼라 생성자 "var"매개 변수에 JAXB FIELD 수준 @XmlElement 주석을 사용하는 것과 같은 상황이 발생했습니다. 이는 나에게도 효과가 없었습니다.

클래스의 고유 필드를 정의하고 생성자의 매개 변수 목록에서이를 초기화하여 ('val/var'키워드 제거) 내 JAXB 문제를 해결했습니다.

class myClass(_id: java.lang.Long) { 
    @Id var id = _id 
} 

기준이 다른 두 대안 제시 :에 주석의 (추가) 요소 유형을 변경

  1. 가 (포함) 매개 변수를, 같은 귀하의 경우에는 그 보일 수 있습니다 소스가있는 경우에만 실행 가능합니다.

  2. target package in 2.9.2의 이름을 meta package for 2.10으로 변경하여 주석을 기본 필드 (또는 다른 옵션)로 다시 분류 (재 표적)하십시오.

+1

답변 해 주셔서 감사합니다. 실제로 REPL에서 코드에있는 정확한 문제를 재현했습니다 (스칼라 프로그램에서 주석을 직접 로그에 기록하려고했으나 할 수 없었습니다). 그래서 여기에 게시 된 예제는 REPL에 있기 때문에 작동하지 않을 수 있습니다.하지만 다른 이유로 인해 코드가 실패합니다. –

+0

당신은 완전합니다. 필드를 명확히 정의하면 문제가 해결됩니다. 감사합니다! –

관련 문제