您的位置:首页 > 职场人生

<黑马程序员> 第九篇:反射

2015-12-08 09:19 513 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

 

9.1 反射技术概述

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对伊任意一个对象,都能够调用它的任意一个方法和属性;
对于这种动态获取信息以及动态嗲用对象的方法的功能称为Java语言的反射机制。
换言之,反射可以对类进行解剖。
总之:反射就是把Java类中的各种成分映射成相应的java类。
想要对一个类进行内容的获取,必须要先获取该字节码文件的对象,该对象是Class类型。
 

9.2 Class对象的获取

9.2.1  方式一:通过对象的getClass方法进行获取
每次都需要具体的类和该类的对象,以及调用getClass方法,较为麻烦。
 

9.2.2  方式二:通过调用某个类的class属性来获取
任何数据类型都具备这一个静态的属性class,通过这个属性可以直接获取到该类的对应class对象。
相比第一种方法要简单一些,它不用创建对象,不用调用getClass方法。
但是还是要使用具体的类,和该类中的一个静态属性class完成。
 
9.2.3  方式三:通过Class类中的forName()方法获取
这种方式较为简单,不需要使用该类,也不需要去调用具体的行为和属性,只需要知道类的名称即可。
这种方式仅知道类名就可以获取该类字节码对象的方式更有利于扩展。
(注意:一个真正的类名是包名加类名)
 

9.3 通过反射技术来获取类的实例

9.3.1方式一:通过Class对象获取类实例(空参)
利用Class类中的newInstance()方法来获取实例
 
步骤:
1.寻找指定的类文件,并加载进内存,并产生Class对象。
2.通过Class类中的newInstance()方法产生该类的对象。
 
例如:
String name = "cn.itcast.bean.Person";

Class clazz = Class.forName(name);

Object obj  = clazz.newInstance();


 
 

9.3.2方式二:通过指定构造函数获取类实例(指定参数列表)
通过Class类中的getConstructor(paramterTypes)方法获取指定的构造函数,再利用Constructor类中的newInstance()方法来获取实例对象。
 
步骤:
1.寻找指定的类文件,并加载进内存,并产生Class对象。
2.获取指定的构造函数对象。
3.通过该构造函数对象的newInstance()方法进行对指定对象的初始化。
 
例如:
String name = "cn.itcast.bean.Person";

Class clazz = Class.forName(name);

Constructor constructor = clazz.getConstructor(String.class,int.class);

Object obj = constructor.newInstance("小明",38);


 
 

9.4通过反射技术访问类中的字段

9.4.1获取
getField():只能获取共有
getDeclaredField():可以获取本类私有。
 

9.4.2赋值
通过Field的set方法赋值。
但是如果字段是私有的,那就需要取消其检查权限后方能赋值(暴力访问)
 
例如:
Class<?> c = Class.forName("cn.itcast.bean.Person");

Object obj = c.newInstance();

Field f = c.getDeclaredField("age");

f.setAccessible(true);

f.set(obj, 22);


 
 

9.5通过反射技术访问类中的方法
通过Method getMethod("方法名","方法参数"),并使用invoke()方法来调用执行。  
 
例如:
Class clazz = Class.forName("cn.itcast.bean.Person");

Method method = clazz.getMethod("paramMethod", String.class,int.class);

Object obj = clazz.newInstance();

method.invoke(obj, "小强",89);


 
PS:若是静态方法,则不需要通过对象调用,invoke()中的对象可写为空。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: