黑马程序员技术交流社区

标题: 如何实现一个内部类的反射? [打印本页]

作者: 袁冬梅    时间: 2012-5-6 17:36
标题: 如何实现一个内部类的反射?
RT,我想尝试对一个内部类进行反射,要怎么做?
我自己实验失败鸟?有人思考过这个问题么?给点建议呀!O(∩_∩)O~
作者: 谭景宾    时间: 2012-5-6 17:54
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;

?    }

作者: 张小锋    时间: 2012-5-6 18:45
要实现一个内部类的反射应该和普通反射基本差不多吧,不过反射原理还是要遵循内部类的使用法则,还是要创建外部类对象,通过对象调用
示例代码:
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");//开始反射
作者: 隋营营    时间: 2012-5-6 18:45
本帖最后由 隋营营 于 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() {
        }
    }
}


作者: 袁冬梅    时间: 2012-5-6 21:22
张小锋 发表于 2012-5-6 18:45
要实现一个内部类的反射应该和普通反射基本差不多吧,不过反射原理还是要遵循内部类的使用法则,还是要创建 ...

原来如此,难怪我尝试失败,3q,看懂了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2