反射是java语言的一个很重要的特性,反射的让java语言在工程的实践中的灵活性大大增强,反射使得java程序在运行的时候可以探测类的信息,动态的创建类的对象,获得对象的属性和方法,因此java反射被广泛的运用在工具和框架的开发。
也许并不是每一个程序员都需要用到java的反射来开发api,但是,理解反射对于我们理解框架和很多java工具是有很大的帮助的,比较这些框架和工具都是以反射作为底层技术的。因为作者也是个菜鸟,只是偶然看见了反射,感觉还不错,所以共享
接下来,就一步步的来操作了
1类对象
1.1概念
要理解反射就必须知道类对象这个概念,相信很多刚开始学习java的人都听过万事万物都是对象,也就是说,类,和数据基本类型也是对象。
可能大家也知道类加载这个概念,当jvm第一次遇到某个类的时候,会通过classpath找到对应的.class文件,对入这个文件并把类的信息保存起来。而.class对象的创建其实就是为了保存类的信息。
1.2如何获取类对象
获取类对象有3种方法
第一种:类名.class
Class c=String.class
第二种:getclass()主要是通过对象来获得类对象
String s;
Class c=getclass(s);
第三种:class.forName()在使用这种方法的时候,我们需要注意这个参数必须带包名,也就是类似于java.util.List
1.3通过类对象获得类的信息
getName()获得类的名称,包括包名
getSimpleName()获得类的名称,不包括包名
getSuperClass()获得本类的父类的类对象
getInterfaceClass()获得本类所实现的所有借口的类对象,返回的类型为类对象的数组
1.4通过类对象获得类中的方法的信息
这里需要简单的说明一下Methods,Method是定义在java.lang.reflet里面的类,一个Method对象封装了一个方法对象,包括方法的名字等
getDeclaredMethods();返回的是一个Methods数组,我们返回的是类所有的公开方法,包括父类中的方法
getMethods();返回的也是一个Methods数组,返回的是本类的所有方法,包括私有的方法。
当然,这两个方法都会 抛出SecurityException
1.4通过类对象创建类的对象
Class c=String.class;
String s=(String)c.newInstance();这个方法是通过类的无参构造方法,创建一个对象
2.反射包
因为是反射包,所以接下来的几个类都是在java.lang.reflect下面
2.1
Field类封装了属性的消息
getDeclaredField 这个方法返回的是Filed的对象,可以 获得的是本类的公开的属性和从父类继承来的属性
getField 这个方法返回的是Filed的对象,可以获得的事本类的所有属性。
Class c=Student.class;
Field nameField=c.getField("name");
同样我们可以通过Field类来修改属性的值
Student s=new Student();
Class c=Student.class;
Field nameField=c.getField("name");
nameField.set(s,"tom");
获取值的话可以也可以通过函数来获取
Object value=nameField.get(s)
一般来说私有属性是不能被读取,修改的,但是我们加入public void setAccessible(true),那么我们就可以读取和修改私有属性了
最后我们再来说说使用反射来调用方法
Student s=new Student();
Class c=stu.getClass();
Method m=c.getDeclaredMethod("study",new Class[]{int.class,double.class});//这个方法表示来了获得一个名为study的带有两个参数的方法
Object value=m.invoke(s,new Object[]{new Integer(10),new Double(1.5)}); //invoke的第一个参数代表对s对象调用方法,第二个参数代表传入参数
所以,反射其实是破坏封装的一种方式,而且反射也有几大缺点1,代码复杂2,运行效率低,3代码脆弱,不易调试,因为反射绕过了编译器的语言检查。
所以,对反射的学习只是为了让我们更好的理解框架和一些工具,各位小伙伴千万不要乱用哦
啊啊啊,终于写完了。。。上个星期就一直想写,到了今天才写。。。