Top > OOoBasic > Generic > Reflection

Reflection Edit

普通はこのページを読む必要はありません。対象は次のような場合です。

  • OOo のバージョンが変わって、メソッド名が変更されてしまったぁああああああああああああ
  • (変な気を起こして) 実行時にプロパティやメソッドの情報を知りたくなった
  • UNO オブジェクトインスペクターを作りたくなった
  • 定数や enum の情報を API リファレンスを見ずに取得したい
  • API 関連のバグを回避できないか…
  • 型名から何かを取得したい
  • モジュールに所属する要素を取得したい
  • いろんなオブジェクトのプロパティの全てを操作したい
  • なんとなく UNO オブジェクトについて調べたくなった
  • …等など。

上記に相当しない場合には、内容が意味不明なので読む必要はありません。

リンク Edit

Edit

「型」と書かれている場合には、インターフェースを指します。これは、XTypeProvider インターフェース由来の用語。多重継承が可能な言語では見えにくいですが、Java などの多重継承が不可の言語ではインターフェースごとに型指定が必要なことからもインターフェース -> 型。

Reflection Edit

com.sun.star.reflection.CoreReflection サービスを利用するとオブジェクトの型情報、名前を指定して型の情報を得ることができます。

  • XIdlClass forName( [in] string sName )
  • XIdlClass getType( [in] any Object )

forName メソッドを利用すると次のようなことが行えます。

oReflection = CreateUnoService("com.sun.star.reflection.CoreReflection")
oIDLClass = oReflection.forName( "com.sun.star.awt.Point" )

Dim aPoint As Object
oIDLClass.createObject( aPoint )

普通は必要ありませんが、動的に UNO オブジェクトを作成できます。

oFields = oIDLClass.getFields()
For i = 0 To UBound(oFields) Step 1
  oField = oFields(i)
  msgbox "Element Name: " & oField.getName() & chr(10) & _
         "Value Type: " & oField.getType().getTypeClass()
Next

各要素の要素名、値の型、アクセス方法、値の設定と取得が行えます。フィールドに関しては XIdlField2 参照。

getType メソッドでも返り値は同じですが、このメソッドではオブジェクトを引数に取ります。

oIDLClass = oReflection.getType(ThisComponent)

Introspection Edit

CoreReflection サービスによく似ていますが、com.sun.star.beans.Introspection サービスを利用するとオブジェクトのサポートしている全ての型情報が得られます。

oIntrospection = CreateUnoService("com.sun.star.beans.Introspection")
oInspected = oIntrospection.inspect(ThisComponent)

msgbox oInspected.hasMethod( "supportsService", com.sun.star.beans.MethodConcept.ALL )

特定のインターフェースを指定しなくても全てのインターフェースを対象にメソッドの情報やプロパティの情報が取得できます。

TypeDescription Edit

名前指向で型情報を取得できます。「名前」による取得なのであるオブジェクトの値を含めた情報を取得といったことには利用できません。

oTDM = GetDefaultContext().getByName( _
    "/singletons/com.sun.star.reflection.theTypeDescriptionManager")

sName = "com.sun.star.awt.XActionListener"

If oTDM.hasByHierarchicalName(sName) Then
  oTD = oTDM.getByHierarchicalName(sName)
  
  oTC = oTD.getTypeClass()
  msgbox oTD.getTypeClass()
  nTypeClass = com.sun.star.uno.TypeClass
  Select Case oTC
  Case nTypeClass.INTERFACE
    
  Case nTypeClass.SERVICE
   
  '...
  End Select
End If

と言った感じになります。返り値は与えた名前によってかなり異なるので注意。

XPropertySetInfo Edit

Introspection からも同じ情報が得られますが、特に inspect する必要がなければプロパティを参照。

Edit

上記にあてはまるときの例。

  • OOo のバージョンが変わって、メソッド名が変更されてしまったぁああああああああああああ

ダイアログのツリーコントロールでは 2.3 から 2.4 でメソッド名が変更されたものがあります。メソッド名が間違っていたのを修正したようですが、告知もありませんでした。

解決案はツリービュー参照。

  • (変な気を起こして) 実行時にプロパティやメソッドの情報を知りたくなった

(変な気を起こさないのが一番ですが、) OOobbs2/101 などで利用している方法や OOoBasic/Macros/MRI 参照。

  • UNO オブジェクトインスペクターを作りたくなった

もっとよく上記について、個別の場合に関して調べる必要がありますが。OOoBasic/Macros/MRI など参照。

  • 定数や enum の情報を API リファレンスを見ずに取得したい
  • モジュールに所属する要素を取得したい

TypeDescription を利用するとできます。

  • API 関連のバグを回避できないか…

メソッド名の変更と同じですが、ツリービューのバグでプロパティ名が変になっていることがありました (2.4)。これを回避するには、XPropertySetInfo などを利用します。

  • 型名から何かを取得したい

CoreReflection を利用します。

  • いろんなオブジェクトのプロパティの全てを操作したい

プロパティであれば、XPropertySetInfo インターフェースを、メソッドでは Introspection を利用します。両方であれば Introspection で。

  • なんとなく UNO オブジェクトについて調べたくなった

もっとよく上記の関連情報について調べてみてください。


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes