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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁冬梅 黑马帝   /  2012-5-6 17:36  /  3474 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

RT,我想尝试对一个内部类进行反射,要怎么做?
我自己实验失败鸟?有人思考过这个问题么?给点建议呀!O(∩_∩)O~

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 很给力!

查看全部评分

4 个回复

倒序浏览
Java利用反射机制实例化对象的时候,需要通过类名来获得Class,例如"android.view.ViewGroup",但是,内部类的类名是比较奇怪的,例如ViewGroup的内部类LayoutParams,在代码中我们可以这样声名ViewGroup.LayoutParams lp = ....,但是实际上这并不是其真正的类名。Java在编译代码时为了区分内部类会将内部类名改为

"ViewGroup$LayoutParams"。所以反射的时候,输入内部类类名要注意这一点。



附上反射实例化类的简单方法。没有做排错处理。

?/**  *   * @param className: 完整类名  * @param argTypes: 构造函数的参数类型  * @param args: 构造函数值  * @return 实例化对象  */static Object reflectInstance(String className, Class[] argTypes,         Object[] args) {     try {         Class viewClass = Class.forName(className);         Constructor con = viewClass.getConstructor(argTypes);         return con.newInstance(args);     } catch (Exception e1) {         e1.printStackTrace();     }

?         return null;

?    }

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
要实现一个内部类的反射应该和普通反射基本差不多吧,不过反射原理还是要遵循内部类的使用法则,还是要创建外部类对象,通过对象调用
示例代码:
public class Person{
class innerText{
private String name;
getXX,setXX
}
}
反射代码:
  Class cla=Class.forName("oa.itheima.Person$innerText");//注意此处的类名,其实就是那个内部类对应字节码的class文件名吧
  Constructor cons=cla.getConstructors()[0];//得到内部类的public够走函数,如果是private用下面一种
  cons=cla.getDeclaredConstructors()[0];//
  cons.setAccessible(true);
Object obj=Person.class.getConstructors()[0].newInstance();//此处要创建一个外部类对象,
Object oj=cons.newInstance(per);///创建内部类对象
setProperty(oj,"str", "xiaofen");//开始反射

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 隋营营 于 2012-5-6 19:02 编辑

历尽千辛万苦,终于搞定!
用代码说明问题:
public class Testext {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("sttt.Fu");   //注意:sttt是包名而且要写类的全名
        c.newInstance();
        Class c2 = Class.forName("sttt.Fu$Zi");   //这里注意内部类的书写格式
        Fu.class.getConstructors()[0].newInstance();  //必须先创建外部类对象,才能创建内部类对象
        System.out.println(c2.getName());  //输出:sttt.Fu$Zi    访问到了内部类的名字
    }
}

class Fu {
    String name;
    public Fu() { //此处必须要有构造函数
    }
    public void happy() {
    }

    private class Zi {
        int age;

        public void sad() {
        }
    }
}

点评

good job  发表于 2012-5-6 21:23

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张小锋 发表于 2012-5-6 18:45
要实现一个内部类的反射应该和普通反射基本差不多吧,不过反射原理还是要遵循内部类的使用法则,还是要创建 ...

原来如此,难怪我尝试失败,3q,看懂了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马