1. 程式人生 > >呼叫內部類的私有方法,其中內部類和外部類的構造器都是私有的

呼叫內部類的私有方法,其中內部類和外部類的構造器都是私有的

1.首先類如下:

package test;

public class Outer {

    private Outer() {

    }

    private void eat(String food) {
        System.out.println("我在吃"+food);
    }

    class Inner{

        private Inner(){

        }
        private void go(String city){
            System.out.println("我要去"+city);
        }
    }

}

2.呼叫方法的類

package test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MainTest {

    public static void main(String[] args) {

        try {
            Class clz = Class.forName("test.Outer");
            System.out
.println(clz); Class clz1 = Class.forName("test.Outer$Inner"); System.out.println(clz1); // 獲取外部類方法 Method mt = clz.getDeclaredMethod("eat", String.class); System.out.println(mt); // 獲取內部類的方法 Method mt1 = clz1.getDeclaredMethod
("go", String.class); System.out.println(mt1); // 獲取外部類的構造器 Constructor c = clz.getDeclaredConstructor(); System.out.println(c); c.setAccessible(true);// 使得外部私有構造器可以被訪問 // 獲取內部構造器 Constructor c1 = clz1.getDeclaredConstructors()[0]; c1.setAccessible(true); System.out.println(c1); // 呼叫外部類的方法eat() mt.setAccessible(true);// 給私有方法賦許可權,使其可以被操作 mt.invoke(c.newInstance(), "米飯"); // 呼叫內部類的方法 mt1.setAccessible(true);// 理由同上 mt1.invoke(c1.newInstance(c.newInstance()), "蘇州"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

3.輸出結果

class test.Outer
class test.Outer$Inner
private void test.Outer.eat(java.lang.String)

private void test.Outer$Inner.go(java.lang.String)
private test.Outer()

private test.Outer$Inner(test.Outer)
我在吃米飯
我要去蘇州