Javaの道 Javaに関する Web www.javaroad.jp
ニュースJava基本Servlet・JSPオープンソースFAQ本・ソフトウェアリンク集掲示板
Javaの道 >  掲示板 >  回答(インナークラスをテスト)
ご回答
氏名
回答内容
 
名前
Take
題名 インナークラスをテスト
質問内容
はじめまして。

テストにて、privateなインナークラスに
アクセスする必要があるのですが・・・

下記ソースですと、インスタンスを生成できず
エラーになってしまい、
インスタンスの型をObjectにすると
java.lang.IllegalAccessException
・・・という状況です。

どなたか、アドバイス頂けると助かります。

□□□□□□□□□□□□□□□□□□□□□□□□□

package test002;

import java.lang.reflect.*;
import test001.Outer;

public class TestMain {
    
    public static void main(String[] args) throws Exception{
        
                Class clazz = Class.forName("test001.Outer$Inner");
        Constructor[] c = clazz.getDeclaredConstructors();
        Outer.Inner instance1 = (Outer.Inner)c[0].newInstance(new Object[] {new Outer()});
        Outer.Inner instance2 = (Outer.Inner)c[1].newInstance(new Object[] {new Outer(),new String("I am Inner(String)")});
//        Object instance1 = c[0].newInstance(new Object[] {new Outer()});
//        Object instance2 = c[1].newInstance(new Object[] {new Outer(),new String("I am Inner(String)")});
        System.out.println("c.length "+ c.length);
        
        for(int i = 0; i<c.length; i++){
            Object[] params = c[i].getParameterTypes();
            for(int j = 0; j<params.length; j++){
                System.out.println("c["+ i +"] : "+ params[j]);
            }
            
        }
        
        Method meth = clazz.getDeclaredMethod("getInnerString",new Class[]{});
        meth.setAccessible(true);
        System.out.println(meth.invoke(instance2,new Object[]{}));
        

        
        
    }

}

□□□□□□□□□□□□□□□□□□□□□□□□□

package test001;

public class Outer {
    
    private class Inner {
        
        Inner(){
            
        }
        
        Inner(String str){
            System.out.println("I am Inner.");
        }
        
        private String getInnerString(){
            return "innnerString";
        }
        
    }

}

□□□□□□□□□□□□□□□□□□□□□□□□□
質問日時 2008-11-07 01:20
名前
やんち
回答内容
(1)JUnitを使う。
(2)テストする時だけ、publicに書き換えておく。
(3)java.lang.reflectを使ってクラスを解析して、テスト用の一時クラスを生成し、テストする。
回答日時 2008-11-07 09:42
名前
てんこ
回答内容
方法1
アウタークラスにインナークラスの
インスタンスを取得するメソッドを用意する。

方法2
http://sengoku.ath.cx/java/contents/contents1/contents1_19.jsp
回答日時 2008-11-10 09:45
このページのトップへ
ニュースJava基本Servlet・JSPオープンソースFAQ本・ソフトウェアリンク集掲示板
Javaの道_CopyrightJavaの道