Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

カプセル化しているFieldにアプリからアクセス可能。これって良いの?

 リフレクションでクラスメンバーにアクセスしてみました。

Public Class TestClass
    Dim var1_ As Integer = 954
    Dim v_ As String = "KK"
    Public Sub New(ByVal var As Integer, ByVal v As String)
        var1_ = var
        v_ = v
    End Sub
End Class

 プロパティ化しない変数Filedだから, NoPublic のFieldInfo で取得できます.
  GetField/SetFieldがすんなり走ってくれました。


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim cl1 As New TestClass(3, "CCC")
        Dim t As Type = GetType(TestClass)

        Dim flg9 As BindingFlags = BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.DeclaredOnly
        Dim fi As FieldInfo = t.GetField("var1_", flg9)

        Dim ob As Object = fi.GetValue(cl1)
        MessageBox.Show(ob.ToString)     =>>値は 3

        fi.SetValue(cl1, -547)
        ob = fi.GetValue(cl1)
        MessageBox.Show(ob.ToString)     =>>値は -547

    End Sub

TestClassのメンバ "var1_"はprivateで隠されているはずなのに,この方法で操作できてしまいます。
t.InvokeMember() でのアクセスは操作できません。

 感覚的にこれはおかしいと思うのですが,仕様なのかな? 私の感覚がおかしいのかな?


 

 

投稿日時 : 2007年1月12日 18:03

Feedback

# re: カプセル化しているFieldにアプリからアクセス可能。これって良いの? 2007/01/12 18:11 シャノン

仕様です。
デバッガとか開発環境とかReflectorとか作るのに便利。
それ以外では使っちゃダメ。

# re: カプセル化しているFieldにアプリからアクセス可能。これって良いの? 2007/01/12 18:23 じゃんぬねっと

リフレクションの世界ならば、普通でしょう。
NonPublic 指定すれば、メソッドも何でも呼び出せますよ。

# re: カプセル化しているFieldにアプリからアクセス可能。これって良いの? 2007/01/13 10:04 Oganc

ありがとうございます。
仕様なんですね。
 自作デバッガ機能に使えますね。

タイトル
名前
Url
コメント