[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が発生しました。
以上