黑马程序员技术交流社区
标题:
如何实现一个内部类的反射?
[打印本页]
作者:
袁冬梅
时间:
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