黑马程序员技术交流社区
标题:
私有内部类.
[打印本页]
作者:
张世钦
时间:
2013-1-28 14:40
标题:
私有内部类.
本帖最后由 zhangshisk 于 2013-1-28 18:03 编辑
怎么样访问私有内部类的方法
如:
class Outer
{
int x = 5;
private class Inner
{
void show()//怎么样调用这个方法?
{
System.out.println(x);
}
}
复制代码
作者:
黑马刘向阳
时间:
2013-1-28 15:31
只要能创建内部类对象就可以调用那个方法,如果在外部其他类中,可以用反射的方式:
Class[] clazzs = Outer.class.getDeclaredClasses();
Constructor<?> con = clazzs[0].getDeclaredConstructor(Outer.class);
con.setAccessible(true);
Object obj = con.newInstance(Outer.class.newInstance());
Method method = clazzs[0].getDeclaredMethod("show");
method.invoke(obj);
复制代码
作者:
刘军亭
时间:
2013-1-28 17:17
在外部类new一个内部类的对象就可以直接访问
作者:
黑马张英涛
时间:
2013-1-28 20:50
使用反射访问私有内部类的方法:
public class MyTest {
public static void main(String[] args) throws Exception {
Object o=null; //用于接收内部类对象
Outer out=new Outer();
Class[] clazz=Outer.class.getDeclaredClasses(); //得到所有内部类
for (Class c : clazz) {
System.out.println(c); //输出结果可以看到内部类名称为 test.Outer$Inner (我的这个类位于test包下)
//得到内部类的所有构造器,由于类本身对外不可见,那么其构造器也是不可见的,所以用DeclaredConstructor
Constructor[] cons = c.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println(con); //输出结果可以看到构造器为:private test.Outer$Inner(test.Outer)
con.setAccessible(true); //修改构造器的权限
o = con.newInstance(out); //内部类要实例化需要传递一个外部类的对象
}
Method[] ms=c.getDeclaredMethods();
for(Method m : ms){
System.out.println(m); //输出结果可以看到方法名称为:void test.Outer$Inner.show()
m.invoke(o, null); //调用内部类中无参数的方法
}
}
}
}
class Outer {
int x = 5;
private class Inner {
void show()// 怎么样调用这个方法?
{
System.out.println(x);
}
}
}
内部类方法能够正常调用,输出为:5
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2