黑马程序员技术交流社区
标题: 个人关于反射的一点总结。请大家多给意见~~ [打印本页]
作者: 姜胜凯 时间: 2014-1-21 21:18
标题: 个人关于反射的一点总结。请大家多给意见~~
一、理解反射
通俗的说,反射就是把java类中的各个成分映射成相应的java类。
Constructor:代表构造函数的类
Field:代表成员变量的类
Method:代表成员方法的类
二、反射的作用
1.框架和框架要解决的核心问题
售楼处卖房子给用户,用户自己装修和安装空调等家具,房子就是一个框架,用户在使用框架,所安装的
东西都是装进售楼出提供的房子这个框架中。
注意:框架和工具类的区别。框架是指用来调用使用者提供的类。而工具类则是被使用者的类调用。
2.框架所要解决的核心问题
我在写框架是,使用者的类可能还不存在。那如何去调用使用者将来所写的类?应为在写程序时无法预知
将来要被调用的类,也就无法new某个类的实例对象。所以要用反射的方式来做。
三、反射的基石--Class类
java程序中的各个java类都属于同一事物,描述这类事物的java类就是Class类。
四、得到各个字节码对应的实例对象(Class类型)
1. 类名.class 如System.class
2. 对象.getClass() 如new Date().getClass()
3. Class forName("类名") 如Class.forName("java.util.Date")
五、九个预定义的Class实例对象
八个基本类型和 void,这些类对象由 Java 虚拟机创建,与其表示的基本类型同名
例:int.class = Integer.TYPE
void.class =Void.TYPE
注: Class类提供了一个方法 isPrimitive()可以用来判断是否为表示为基本类型。
六、Constructor类
1.得到某个类的所有构造方法:通过Class类的 getConstructors()获得。返回一个包含Constructor对象的
数组
例:Constructor[] cotrs = String.class.getConstructors();
2.得到某一个构造方法:通过Class类的getConstructor(参数)获得。
例:Constructor cotr = String.class.getConstructor(StringBuffer.class);
3.创建实例对象:
通常:String str=new String(new StringBuffer("abc"));
反射:Constructor cotr = String.class.getConstructor(StringBuffer.class);
String str = (String)cotr.getInstance(new StringBuffer("abc"));
4.Class.newInstance()与Constructor.getInstance(参数);区别
Class.newInstance()是通过内部先得到默认的构造方法创建实例对象。效率高。
七、Filed类:代表某个类的成员变量。
获取成员变量
Class.getFiled(String name)与geteclaredField(String name)区别。
注: 第一个是获取可见的成员变量(public)、第二个可以获取私有的成员变量,与setAccessible(ture)一起
使用,称为暴力反射。
八、Method类:代表某个类的一个成员方法
1.得到类中的某一个方法:
例: Method charAt= String.class.getMethod("charAt",int.Class);
2.调用方法:
通常:str.charAt(1);
反射:Method charAt= String.class.getMethod("charAt",int.Class);
charAt.invoke(new String("abc"),1);
注:如果invoke()方法的第一个参数为null,则所调用的为静态方法。
九、数组的反射
1.具有相同维数和元素类型的数组属于同一个类型,
2.代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class.
3.基本类型的一维数组可以被当作Object类型使用。不能当作Object[]类型使用。非基本类型的一维数组,既可
以当作Object类型使用,又可作为Object[]类型使用。
例:int [] a1 = new int[3];
int [] a2 = new int[5];
int[][]a3= new int [2][3];
String[] a4 = new String[3];
a1.getclass() == a2.getclass(); ture
a1.getClass()==a3.getclass(); false
a1.getclass()==a4.getclass(); false
作者: 大大老伴要跪IT 时间: 2014-1-21 21:44
不错,学习下的!
作者: anxinjia 时间: 2014-1-21 21:51
不错喔!学习一下!
作者: joiya 时间: 2014-1-22 19:18
这帖子太好了,长见识了。值得学习!顶起来
作者: joiya 时间: 2014-1-22 19:19
酷毙了!很好。希望有更多这样的帖子,互相交流进步也很快。
作者: joiya 时间: 2014-1-22 19:31
不错,学习下的!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |