[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 11989] Re: 「アジャイル ソフトウェア開発の奥義」 : 第九回議事録 ( 案)



小棚木です。

下記の件を実験してみました。
使用したJDKは 1.5.0_03です。

> Q. Private Method に作られる Inner Class も Public Class となる
>    Security Hole になるかも ??
>    Coding 規約上では、Private Method での Innter Class は、ご法度
>    A. そうゆう場合は java はやめろ..
>    Q. 問題になるケースは ?

package hoge;

public class A2
{
    private void hoge()
    {
        Object x = new Object(){ public String toString()
                                 { return "hoge3"; }
                               };
        System.out.println(x.toString());
    }
}

import hoge.A2;

public class C2
{
    public static void main(String[] args) throws Exception
    {
        Class clazz = Class.forName("hoge.A2$1");
        Object obj = clazz.newInstance();
        System.out.println(obj.toString());
    }
}

結果はInstantiationExceptionが発生して、無名クラスのインスタンスが作成
できませんでした。

さらにもう1つ実験してみました。今度はデフォルトアクセスのクラスのpublic
インナークラスに対して操作可能かどうかを調べてみました。
こちらは内部クラスにアクセスできました。

package hoge;

class A
{
    public static class B
    {
        public String toString()
        {
            return "hoge1";
        }
    }

    public String toString()
    {
        return "hoge2";
    }
}

import hoge.*;

public class C
{
    public static void main(String[] args) throws Exception
    {
        Class clazz1 = Class.forName("hoge.A$B");
        Object b1 = clazz1.newInstance();
        System.out.println(b1.toString());

        // ClassNotFoundException
//        Class clazz2 = Class.forName("hoge.A.B");
//        Object b2 = clazz2.newInstance();
//        System.out.println(b2.toString());

        // A.BはAが不可視のためコンパイルエラー
        // A$Bはバイナリ名での参照禁止のためコンパイルエラー

        // IllegalAccessException
//        Class clazz3 = Class.forName("hoge.A");
//        Object b3 = clazz3.newInstance();
//        System.out.println(b3.toString());
    }
}

クラスAに直接アクセスしようとすると、クラスが不可視のためコンパイルエ
ラーになりました。そのため内部クラスBにもアクセスはできませんでした。
しかし、リフレクションを利用した場合は、内部クラスBにアクセスできて、
toString()で「hoge1」が正常に返却されました。一方、クラスAをリフレク
ションで呼び出した場合はIllegalAccessExceptionが発生しました。

以上