2013-11-04 3 views
0

MemberScope 반사에서 슈퍼 클래스를 찾을 수 성공없이 다양한 방법을 시도해 보았습니다.) :어떻게 몇 반사 내가 사용 방법을

def modelMembers = members.filter(member => member.typeSignature == Model) 

여기서 Model은 수퍼 클래스입니다. 문제는 하위 분류 유형 서명 만 파악할 수 있다는 것입니다. 모델의 하위 클래스 인 경우이를 기반으로 멤버를 필터링 할 수 있습니까?

+0

isInstanceOf [모델]? –

+0

nah가 작동하지 않는 것 같습니다. – rfrittelli

답변

1

는 종류가 다른의 하위 유형 인 경우 테스트하는 매우 편리한 <:< 연산자가있다.

예 :

trait A 
class B extends A 
class C extends A 

class X { 
    val hello: C = null 
    var world: B = null 
} 

scala> import reflect.runtime.universe._ 
import reflect.runtime.universe._ 

scala> typeOf[X].members.filter(_.typeSignature <:< typeOf[A]) 
res0: Iterable[Symbol] = SynchronizedOps(variable world, value hello) 
0

나를 위해 효과가있는 것 같습니다.

package load.data 

abstract class AbstractPoint 
case class Point() extends AbstractPoint 

object ModelTest { 
    def main(arg: Array[String]) = 
    { 
     val li = List(new Point()) 
     assert(li.filter(_.isInstanceOf[AbstractPoint]).length == 1) 
    } 
} 
+0

나는이 작품을 알아. 내가 가지고있는 문제는 반사와 관련이있다. Symbol 객체가 기본 클래스인지 아닌지를 알 수 없습니다. – rfrittelli

+0

: "nah는 작동하지 않는 것 같습니다." ?? –

+0

리플렉션 코드를 사용해 보셨습니까? 분명히 여기서 당신의 예제가 작동 할 것이지만, 이것은 내가 성취하려고하는 것이 아닙니다. – rfrittelli

0

해킹을 발견했습니다. 누구든지 좀 더 구체적인 방법을 알고 있다면 나는 그것을보고 싶어 할 것입니다.

def modelMembers = members.filter(_.typeSignature <:< typeOf[Model]) 

: 이것은 단지 당신에게 필드, Model 반환 형식하지 방법을 얻을 것이다

def modelMembers = { 
    val filtered = members.filter(member => member.typeSignature.baseClasses.size > 0 && member.isTerm && !member.isMethod) 
    filtered.filter(_.typeSignature.baseClasses.exists(_.name.toString == "Model")) 
    }