您的位置:首页 > 其它

调用内部类的私有方法,其中内部类和外部类的构造器都是私有的

2017-04-10 22:43 453 查看

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)

我在吃米饭

我要去苏州
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  反射