Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions ja/overviews/reflection/annotations-names-scopes.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ title: アノテーション、名前、スコープ、その他
Scala において宣言は `scala.annotation.Annotation` のサブタイプを用いて注釈を付けることができる。
さらに、Scala は [Java のアノテーションシステム](http://docs.oracle.com/javase/7/docs/technotes/guides/language/annotations.html#_top)に統合するため、標準 Java コンパイラによって生成されたアノテーションを取り扱うこともできる。

アノテーションは、それが永続化されていればリフレクションを使ってインスペクトすることができるため、アノテーション付きの宣言を含むクラスファイルから読み込むことができる。カスタムアノテーション型は
アノテーションは、それが永続化されていればリフレクションを使ってインスペクトすることができるため、アノテーション付きの宣言を含むクラスファイルから読み込むことができる。カスタムアノテーション型は
`scala.annotation.StaticAnnotation` か
`scala.annotation.ClassfileAnnotation` を継承することで永続化することができる。
その結果、アノテーション型のインスタンスはクラスファイル内の特別な属性として保存される。
Expand All @@ -40,7 +40,7 @@ Scala または Java アノテーションに対しては `scalaArgs` は空で
アノテーションの場合は、引数は `scalaArgs` に保持され、`javaArgs` は空となる。

`scalaArgs` 内の引数は型付けされた構文木として表される。
これらの構文木はタイプチェッカより後のどのフェーズにおいても変換されないことに注意する必要がある。
これらの構文木はタイプチェッカより後のどのフェーズにおいても変換されないことに注意する必要がある。
`javaArgs` 内の引数は `scala.reflect.api.Names#Name` から
`scala.reflect.api.Annotations#JavaArgument` へのマップとして表現される。
`JavaArgument` のインスタンスは Java アノテーションの引数の様々な型を表現する:
Expand All @@ -64,24 +64,24 @@ Scala または Java アノテーションに対しては `scalaArgs` は空で
import scala.reflect.runtime.universe._

scala> val mapName = newTermName("map")
mapName: reflect.runtime.universe.TermName = map
mapName: scala.reflect.runtime.universe.TermName = map

上のコードでは、実行時リフレクション・ユニバースに関連付けられた `Name` を作成している。
(これはパス依存型である `reflect.runtime.universe.TermName` が表示されていることからも分かる。)

名前は型のメンバの照会に用いられる。例えば、`List` クラス内で宣言されている (項である) `map` メソッドを検索するには以下のようにする:

scala> val listTpe = typeOf[List[Int]]
listTpe: reflect.runtime.universe.Type = scala.List[Int]
listTpe: scala.reflect.runtime.universe.Type = scala.List[Int]

scala> listTpe.member(mapName)
res1: reflect.runtime.universe.Symbol = method map
res1: scala.reflect.runtime.universe.Symbol = method map

型メンバを検索するには `newTypeName` を代わりに使って `member` を呼び出す。
暗黙の変換を使って文字列から項もしくは型の名前に変換することもできる:

scala> listTpe.member("map": TermName)
res2: reflect.runtime.universe.Symbol = method map
res2: scala.reflect.runtime.universe.Symbol = method map

### 標準名

Expand Down Expand Up @@ -115,7 +115,7 @@ Scala のプログラムにおいて、「`_root_`」のような特定の名前
以下に `List` クラスでオーバーライドされている全てのシンボルのリストを宣言順に返す具体例をみてみよう:

scala> val overridden = listTpe.declarations.sorted.filter(_.isOverride)
overridden: List[reflect.runtime.universe.Symbol] = List(method companion, method ++, method +:, method toList, method take, method drop, method slice, method takeRight, method splitAt, method takeWhile, method dropWhile, method span, method reverse, method stringPrefix, method toStream, method foreach)
overridden: List[scala.reflect.runtime.universe.Symbol] = List(method companion, method ++, method +:, method toList, method take, method drop, method slice, method takeRight, method splitAt, method takeWhile, method dropWhile, method span, method reverse, method stringPrefix, method toStream, method foreach)

## Expr

Expand Down Expand Up @@ -278,7 +278,7 @@ Java の列挙要素への参照はシンボル (`scala.reflect.api.Symbols#Symb
import scala.reflect.runtime.universe._

scala> def tree = reify { final class C { def x = 2 } }.tree
tree: reflect.runtime.universe.Tree
tree: scala.reflect.runtime.universe.Tree

scala> show(tree)
res0: String =
Expand Down Expand Up @@ -351,7 +351,7 @@ Java の列挙要素への参照はシンボル (`scala.reflect.api.Symbols#Symb
import scala.reflect.runtime.universe._

scala> def tpe = typeOf[{ def x: Int; val y: List[Int] }]
tpe: reflect.runtime.universe.Type
tpe: scala.reflect.runtime.universe.Type

scala> show(tpe)
res0: String = scala.AnyRef{def x: Int; val y: scala.List[Int]}
Expand Down
36 changes: 18 additions & 18 deletions ja/overviews/reflection/environment-universes-mirrors.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ invoker ミラーを作成することができる。
ru: scala.reflect.api.JavaUniverse = ...

scala> val m = ru.runtimeMirror(getClass.getClassLoader)
m: reflect.runtime.universe.Mirror = JavaMirror ...
m: scala.reflect.runtime.universe.Mirror = JavaMirror ...

`InstanceMirror` はメソッド、フィールド、内部クラス、および内部オブジェクトの invoker ミラーを作成するのに使われる。作り方: `val im = m.reflect(<value>)`。
具体例:
Expand All @@ -83,16 +83,16 @@ invoker ミラーを作成することができる。
defined class C

scala> val im = m.reflect(new C)
im: reflect.runtime.universe.InstanceMirror = instance mirror for C@3442299e
im: scala.reflect.runtime.universe.InstanceMirror = instance mirror for C@3442299e

`MethodMirror` はインスタンス・メソッド (Scala にはインスタンス・メソッドのみがある。オブジェクトのメソッドは `ModuleMirror.instance` から取得されるオブジェクト・インスタンスのインスタンス・メソッドだ。) の呼び出しに使われる。作り方: `val mm = im.reflectMethod(<method symbol>)`。
具体例:

scala> val methodX = ru.typeOf[C].declaration(ru.newTermName("x")).asMethod
methodX: reflect.runtime.universe.MethodSymbol = method x
methodX: scala.reflect.runtime.universe.MethodSymbol = method x

scala> val mm = im.reflectMethod(methodX)
mm: reflect.runtime.universe.MethodMirror = method mirror for C.x: scala.Int (bound to C@3442299e)
mm: scala.reflect.runtime.universe.MethodMirror = method mirror for C.x: scala.Int (bound to C@3442299e)

scala> mm()
res0: Any = 2
Expand All @@ -104,27 +104,27 @@ invoker ミラーを作成することができる。
defined class C

scala> val m = ru.runtimeMirror(getClass.getClassLoader)
m: reflect.runtime.universe.Mirror = JavaMirror ...
m: scala.reflect.runtime.universe.Mirror = JavaMirror ...

scala> val im = m.reflect(new C)
im: reflect.runtime.universe.InstanceMirror = instance mirror for C@5f0c8ac1
im: scala.reflect.runtime.universe.InstanceMirror = instance mirror for C@5f0c8ac1

scala> val fieldX = ru.typeOf[C].declaration(ru.newTermName("x")).asTerm.accessed.asTerm
fieldX: reflect.runtime.universe.TermSymbol = value x
fieldX: scala.reflect.runtime.universe.TermSymbol = value x

scala> val fmX = im.reflectField(fieldX)
fmX: reflect.runtime.universe.FieldMirror = field mirror for C.x (bound to C@5f0c8ac1)
fmX: scala.reflect.runtime.universe.FieldMirror = field mirror for C.x (bound to C@5f0c8ac1)

scala> fmX.get
res0: Any = 2

scala> fmX.set(3)

scala> val fieldY = ru.typeOf[C].declaration(ru.newTermName("y")).asTerm.accessed.asTerm
fieldY: reflect.runtime.universe.TermSymbol = variable y
fieldY: scala.reflect.runtime.universe.TermSymbol = variable y

scala> val fmY = im.reflectField(fieldY)
fmY: reflect.runtime.universe.FieldMirror = field mirror for C.y (bound to C@5f0c8ac1)
fmY: scala.reflect.runtime.universe.FieldMirror = field mirror for C.y (bound to C@5f0c8ac1)

scala> fmY.get
res1: Any = 3
Expand All @@ -141,19 +141,19 @@ invoker ミラーを作成することができる。
defined class C

scala> val m = ru.runtimeMirror(getClass.getClassLoader)
m: reflect.runtime.universe.Mirror = JavaMirror ...
m: scala.reflect.runtime.universe.Mirror = JavaMirror ...

scala> val classC = ru.typeOf[C].typeSymbol.asClass
classC: reflect.runtime.universe.Symbol = class C
classC: scala.reflect.runtime.universe.Symbol = class C

scala> val cm = m.reflectClass(classC)
cm: reflect.runtime.universe.ClassMirror = class mirror for C (bound to null)
cm: scala.reflect.runtime.universe.ClassMirror = class mirror for C (bound to null)

scala> val ctorC = ru.typeOf[C].declaration(ru.nme.CONSTRUCTOR).asMethod
ctorC: reflect.runtime.universe.MethodSymbol = constructor C
ctorC: scala.reflect.runtime.universe.MethodSymbol = constructor C

scala> val ctorm = cm.reflectConstructor(ctorC)
ctorm: reflect.runtime.universe.MethodMirror = constructor mirror for C.<init>(x: scala.Int): C (bound to null)
ctorm: scala.reflect.runtime.universe.MethodMirror = constructor mirror for C.<init>(x: scala.Int): C (bound to null)

scala> ctorm(2)
res0: Any = C(2)
Expand All @@ -165,13 +165,13 @@ invoker ミラーを作成することができる。
defined module C

scala> val m = ru.runtimeMirror(getClass.getClassLoader)
m: reflect.runtime.universe.Mirror = JavaMirror ...
m: scala.reflect.runtime.universe.Mirror = JavaMirror ...

scala> val objectC = ru.typeOf[C.type].termSymbol.asModule
objectC: reflect.runtime.universe.ModuleSymbol = object C
objectC: scala.reflect.runtime.universe.ModuleSymbol = object C

scala> val mm = m.reflectModule(objectC)
mm: reflect.runtime.universe.ModuleMirror = module mirror for C (bound to null)
mm: scala.reflect.runtime.universe.ModuleMirror = module mirror for C (bound to null)

scala> val obj = mm.instance
obj: Any = C$@1005ec04
Expand Down
22 changes: 11 additions & 11 deletions ja/overviews/reflection/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,27 +100,27 @@ Scala コンパイラが持つ型情報を全ては入手できない可能性
defined class Person

scala> val m = ru.runtimeMirror(getClass.getClassLoader)
m: reflect.runtime.universe.Mirror = JavaMirror with ...
m: scala.reflect.runtime.universe.Mirror = JavaMirror with ...

最初のステップとして現在のクラスローダで読み込まれた (`Person` クラスを含む)
最初のステップとして現在のクラスローダで読み込まれた (`Person` クラスを含む)
全てのクラスや型をアクセス可能とするミラー `m` を取得する。

scala> val classPerson = ru.typeOf[Person].typeSymbol.asClass
classPerson: reflect.runtime.universe.ClassSymbol = class Person
classPerson: scala.reflect.runtime.universe.ClassSymbol = class Person

scala> val cm = m.reflectClass(classPerson)
cm: reflect.runtime.universe.ClassMirror = class mirror for Person (bound to null)
cm: scala.reflect.runtime.universe.ClassMirror = class mirror for Person (bound to null)

次に、`reflectClass` メソッドを使って `Person` クラスの `ClassMirror` を取得する。
`ClassMirror` は `Person` クラスのコンストラクタへのアクセスを提供する。

scala> val ctor = ru.typeOf[Person].declaration(ru.nme.CONSTRUCTOR).asMethod
ctor: reflect.runtime.universe.MethodSymbol = constructor Person
ctor: scala.reflect.runtime.universe.MethodSymbol = constructor Person

`Person` のコンストラクタのシンボルは実行時ユニバース `ru` を用いて `Person` 型の宣言から照会することによってのみ得られる。

scala> val ctorm = cm.reflectConstructor(ctor)
ctorm: reflect.runtime.universe.MethodMirror = constructor mirror for Person.<init>(name: String): Person (bound to null)
ctorm: scala.reflect.runtime.universe.MethodMirror = constructor mirror for Person.<init>(name: String): Person (bound to null)

scala> val p = ctorm("Mike")
p: Any = Person(Mike)
Expand All @@ -143,22 +143,22 @@ Scala コンパイラが持つ型情報を全ては入手できない可能性
import scala.reflect.runtime.{universe=>ru}

scala> val m = ru.runtimeMirror(p.getClass.getClassLoader)
m: reflect.runtime.universe.Mirror = JavaMirror with ...
m: scala.reflect.runtime.universe.Mirror = JavaMirror with ...

`shipped` メンバにアクセスするには、前の例と同じく、`p` のクラス (`Purchase`) を含むクラスローダが読み込んだ全てのクラスを入手可能とするミラー `m`
を取得することから始める。

scala> val shippingTermSymb = ru.typeOf[Purchase].declaration(ru.newTermName("shipped")).asTerm
shippingTermSymb: reflect.runtime.universe.TermSymbol = method shipped
shippingTermSymb: scala.reflect.runtime.universe.TermSymbol = method shipped

次に、`shipped` フィールドの宣言を照会して `TermSymbol` (`Symbol` 型の 1つ) を得る。
この `Symbol` は後で (何からのオブジェクトの) このフィールドの値にアクセスするのに必要なミラーを得るのに使う。

scala> val im = m.reflect(p)
im: reflect.runtime.universe.InstanceMirror = instance mirror for Purchase(Jeff Lebowski,23819,false)
im: scala.reflect.runtime.universe.InstanceMirror = instance mirror for Purchase(Jeff Lebowski,23819,false)

scala> val shippingFieldMirror = im.reflectField(shippingTermSymb)
shippingFieldMirror: reflect.runtime.universe.FieldMirror = field mirror for Purchase.shipped (bound to Purchase(Jeff Lebowski,23819,false))
shippingFieldMirror: scala.reflect.runtime.universe.FieldMirror = field mirror for Purchase.shipped (bound to Purchase(Jeff Lebowski,23819,false))

ある特定のインスタンスの `shipped` メンバにアクセスするためには、その特定のインスタンス `p`
のためのミラー `im` を必要とする。
Expand Down Expand Up @@ -241,7 +241,7 @@ Scala のランタイム型は全てのコンパイル時の型情報を保持
| val rightTag = ru.typeTag[S]
| leftTag.tpe <:< rightTag.tpe
| }
m: [T, S](x: T, y: S)(implicit evidence$1: reflect.runtime.universe.TypeTag[T], implicit evidence$2: reflect.runtime.universe.TypeTag[S])Boolean
m: [T, S](x: T, y: S)(implicit evidence$1: scala.reflect.runtime.universe.TypeTag[T], implicit evidence$2: scala.reflect.runtime.universe.TypeTag[S])Boolean

scala> m(d, c)
res9: Boolean = true
Expand Down
Loading