呼叫內部類的私有方法,其中內部類和外部類的構造器都是私有的
阿新 • • 發佈:2018-12-26
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)
我在吃米飯
我要去蘇州