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

© 天黑偷牛 中级黑马   /  2014-8-28 16:26  /  2863 人查看  /  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-31 23:42:43
26#
挺好的!
回复 使用道具 举报
MeryStyle 来自手机 中级黑马 2014-8-31 20:54:48
25#
赞一个!!
回复 使用道具 举报
毕老师 java基础视频好像没有 反射啊
回复 使用道具 举报
多谢分享
回复 使用道具 举报
玥夜 发表于 2014-8-31 17:48
版主是不是可以弄到很多很多黑马币 和技术分啊

不是
回复 使用道具 举报
版主是不是可以弄到很多很多黑马币 和技术分啊
回复 使用道具 举报
赞一个。
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
顶!!!!!!!!!!!!!
回复 使用道具 举报
这个好,,,,
回复 使用道具 举报
jeromechen 发表于 2014-8-28 21:59
楼主是论坛的很活跃的一份子,赞一个,加油

共勉,共勉,一起加油
回复 使用道具 举报
总结得很好!
回复 使用道具 举报
楼主是论坛的很活跃的一份子,赞一个,加油
回复 使用道具 举报
严国泽 发表于 2014-8-28 20:33
从你那取了几个视频,谢咯

不客气啦
回复 使用道具 举报
反射。。。。。
回复 使用道具 举报
很好  赞一个
回复 使用道具 举报
赞!!!!
回复 使用道具 举报
赞一个!好多都忘记了!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马