java学习之反射

        反射是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代码脆弱,不易调试,因为反射绕过了编译器的语言检查。

所以,对反射的学习只是为了让我们更好的理解框架和一些工具,各位小伙伴千万不要乱用哦

啊啊啊,终于写完了。。。上个星期就一直想写,到了今天才写。。。

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值