A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张世钦 中级黑马   /  2013-1-28 14:40  /  1674 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zhangshisk 于 2013-1-28 18:03 编辑

怎么样访问私有内部类的方法
如:
  1. class Outer
  2. {
  3. int x = 5;
  4.         private class Inner
  5.         {
  6.                 void show()//怎么样调用这个方法?
  7.                 {
  8.                 System.out.println(x);
  9.                 }
  10.         }
复制代码

3 个回复

倒序浏览
只要能创建内部类对象就可以调用那个方法,如果在外部其他类中,可以用反射的方式:
  1. Class[] clazzs = Outer.class.getDeclaredClasses();
  2.             Constructor<?> con = clazzs[0].getDeclaredConstructor(Outer.class);
  3.            
  4.             con.setAccessible(true);
  5.             Object obj = con.newInstance(Outer.class.newInstance());
  6.            
  7.             Method method = clazzs[0].getDeclaredMethod("show");
  8.             method.invoke(obj);
复制代码
回复 使用道具 举报
在外部类new一个内部类的对象就可以直接访问
回复 使用道具 举报
使用反射访问私有内部类的方法:
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

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马