Top > OOoBasic > Generic > Reflection

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

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

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

#contents
**リンク [#g925004b]

-[[UNO_Reflection_API>http://doc.services.openoffice.org/wiki/Documentation/DevGuide/AdvUNO/UNO_Reflection_API]]
-[[Introspection>http://api.openoffice.org/docs/common/ref/com/sun/star/beans/Introspection.html]]
-[[CoreReflection>http://api.openoffice.org/docs/common/ref/com/sun/star/reflection/CoreReflection.html]]
-[[TypeDescriptionManager>http://api.openoffice.org/docs/common/ref/com/sun/star/reflection/TypeDescriptionManager.html]]
-[[XIdlClass>http://api.openoffice.org/docs/common/ref/com/sun/star/reflection/XIdlClass.html]]
-[[TypeClass>http://api.openoffice.org/docs/common/ref/com/sun/star/uno/TypeClass.html]]
**型 [#h6d80d69]
「型」と書かれている場合には、インターフェースを指します。これは、XTypeProvider インターフェース由来の用語。多重継承が可能な言語では見えにくいですが、Java などの多重継承が不可の言語ではインターフェースごとに型指定が必要なことからもインターフェース -> 型。
**Reflection [#k715965b]
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>http://api.openoffice.org/docs/common/ref/com/sun/star/reflection/XIdlField2.html]] 参照。

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

 oIDLClass = oReflection.getType(ThisComponent)
**Introspection [#zab823c5]
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 [#d092d9de]
名前指向で型情報を取得できます。「名前」による取得なのであるオブジェクトの値を含めた情報を取得といったことには利用できません。

 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 [#p4bab504]
Introspection からも同じ情報が得られますが、特に inspect する必要がなければ[[プロパティ>OOoBasic/Generic/Property]]を参照。

**例 [#nc374589]
上記にあてはまるときの例。

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

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

解決案は[[ツリービュー>OOoBasic/Dialog/TreeView#t4e4376d]]参照。

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

(変な気を起こさないのが一番ですが、) [[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