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

© 天黑偷牛 中级黑马   /  2014-8-28 16:26  /  2860 人查看  /  26 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

一、简介
反射技术:动态的获取类中的成员,并调用该类的成员。(也可以叫对类的解剖)
反射技术核心问题:要拿到类的字节码文件,即.class文件


字节码文件中会包含以下内容:
name(类名),constructor(构造器),field(字段),method(方法);
所以会有相应的获取这些内容的方法
getName();getConstructor();getField();getMethod();


描述字节码文件的类:Class
字节码文件只加载一次,即每个类在内存中只有一份.class文件


二、如何获取一个字节码文件的对象?


方式一:
Object中的getClass();该方法在反射技术里,不合适,必须有对象才能使用,反射中不明确具体类
Person p = new Person();
Class clazz = p1.getClass();


方式二:
所有的数据类型都有自己的Class对象,每一个数据类型都有一个默认的静态属性.class,可以用该属性获取到字节码文件对象
这个也必须要有对象才可以
int.class int类型的class对象
Person.class Person类型的class对象


方式三(重点掌握):
Class.forName(String name),通过名称获取对应的字节码文件对象。
Class.forName(String name):name必须加上包名

三、动态创建对象:
1.根据给定的类名获取Class对象
Class clazz = Class.forName(className);
创建一个对象
Object obj = clazz.newInstance();
newInstance()调用空参数构造函数,如果没有空参数构造函数就会抛出java.lang.InstationException
一般被反射的类通常都有空参数构造函数

2.根据指定的构造器动态创建对象:
先获取指定的构造函数


(1).通过Class获取指定的构造函数,比如带两个参数
Constructor cons = clazz.getConstructor(String.class,int.class);参数为类型对象


(2).动过指定的构造器对对象进行初始化
Object obj = cons.newInstance("zhangsan",19);

四、动态的获取字段
clazz.getFields():获取所有字段
clazz.getFields(String name):获取指定名称的字段
getXXX():只能拿到公有的,也就是public的


getDeclaredXXX():可以拿共有的和私有的,只要你声明,就会被拿到
例如:getDeclaredConstructor()


要对非静态的字段操作必须有对象
filed.set(obj,12);不能给private修饰的字符赋值


使用父类的方法将访问权限检查能力取消
filed.setAccessible(true);暴力访问
filed.set(obj,12);


五、动态获取方法


1.反射非静态无参数方法:
Method method = clazz.getMethod("methodName",null);
method.invoke(obj,null);调用方法


2.反射静态无惨方法:
Method method = clazz.getMethod("methodName",null);
method.invoke(null,null);调用方法


3.反射非静态有参数方法:
Method method = clazz.getMethod("methodName",String.class,int,class);
method.invoke(obj,"zhangsan",49);

评分

参与人数 1技术分 +1 收起 理由
追求卓越 + 1

查看全部评分

26 个回复

倒序浏览
赞一个!!!
回复 使用道具 举报

唉,都没人来给我回复一下,还是你好啊
回复 使用道具 举报
天黑偷牛 发表于 2014-8-28 18:03
唉,都没人来给我回复一下,还是你好啊

呵呵,这必须的啊
回复 使用道具 举报
老毕的关于反射的视频在哪?
回复 使用道具 举报
坤儿 发表于 2014-8-28 18:20
老毕的关于反射的视频在哪?

我以前分享过,你查查我的帖子
回复 使用道具 举报
反射,映射,泛型
回复 使用道具 举报
从你那取了几个视频,谢咯
回复 使用道具 举报
赞一个!好多都忘记了!
回复 使用道具 举报
赞!!!!
回复 使用道具 举报
很好  赞一个
回复 使用道具 举报
反射。。。。。
回复 使用道具 举报
严国泽 发表于 2014-8-28 20:33
从你那取了几个视频,谢咯

不客气啦
回复 使用道具 举报
楼主是论坛的很活跃的一份子,赞一个,加油
回复 使用道具 举报
总结得很好!
回复 使用道具 举报
jeromechen 发表于 2014-8-28 21:59
楼主是论坛的很活跃的一份子,赞一个,加油

共勉,共勉,一起加油
回复 使用道具 举报
这个好,,,,
回复 使用道具 举报
顶!!!!!!!!!!!!!
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
赞一个。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马