文档章节

Java反射知识总结(2)——阅读

关河
 关河
发布于 2016/01/20 10:09
字数 904
阅读 80
收藏 3

       上一部分介绍了反射的一些基本内容,现在将利用反射完成更多的事情。

一、  Field类

      Field类封装了属性的信息,一个Field类封装了一个属性的信息,类似于Method对象封装了方法的信息一样。那么如何获取Field对象呢?在Class类中通常有以下两个方法:

     1、Field  getDeclaredField(String name)                                    ----方法1

     2、Field  getField(String name)                                                  -----方法2

   是不是和获取Method对象的方法很相似呢?不错,获取Field基本和获取Method对象是一致的。

    getField 方法可以获 得本类的公开属性以及从父继承到,但是无法获非公开属性;而getDeclaredField方法只能获得本类属性,但这包括的本类的非公开属性。

   例如:要获取Student类的name属性的Field对象,可以使用如下的代码:

     Class c=Student.class;

     Field nameField=c.getField("name");

   这样就获取到了对应的Field对象。

 

  那么获取到Field对象之后,我们可以修改相关属性的值,那优势如何操作的呢?

  利用public void set(Object obj,Object value)方法来修改属性

  例如:

        Student u =new Student();

       Filed ageField=u.getClass().getDeclaredField("age");

       ageField.setAccessible(true);

       ageField.set(u,new Integer(18));

    需要注意的是,这里我们使用了getDeclaredField方法,因为此处的age是作为一个私有的属性的,而getField只能访问公开的属性,而对于私有的属性一般情况下是无法读取、修改的,而通过反射确可以修改,只需要增加 

      ageField.setAccessible(true)

        代码即可。

二、利用反射调用对象的方法

    利用反射调用方法,首先我们需要获取到被调用的方法所对应的Method对象,然后利用Method对象调用invoke方法。invoke方法签名如下:

    public Object invoke(Object obj,Object[] args)

    在这个方法中有两个参数,参数1 obj表示对那个对象调用方法,参数2 args表示调用方法时候的参数列表,invoke方法返回值对应于Method对象所代表的方法调用时候的返回值。

   例如:

         Student stu=new Student();

        Method m=stu.getClass().getDeclaredMethod("study",new Class[]{int.class,double.class});

        Object result=m.invoke(stu,new Object[]{new Integer(10),new Double(1.5)});

      上面就是利用反射调用方法。与Field对象类似,也可以调用一个类的私有方法,只需要在调用Method方法之前,先调用setAccessible(true)即可。


 反射的优势:

      其实总结来说,反射的优势在于更多的复用代码,这也是为什么工具和框架编写时候常用反射的原因,下面一个例子大致可以窥见端倪

      原:

          Student s =new Student();

          s.study();

    反射:

       String className = "Student";

       Class c = Class.forName(className);

       Object o = c.newInstance(); 

       String methodName = "study"; 

       Method m = c.getMethod(methodName , new Class[]{}); 

        m.invoke(o , new Object[]{}); 

  

当然,这里并不是鼓励大家滥用反射。反射技术有着非常显著的几个缺点。

  1. 运行效率与不用反射的代码相比会有明显下降。

   2. 代码的复杂度大幅提升,这个从量上家就能比较出来

  3. 代码会变得脆弱,不易调试。使用反射我们就在一定程度上绕开了编译器的语法代码会变得脆弱,不易调试。 使用反射我们就在一定程度上绕开了编译器的语法检查,例如用反射去调一个对象的方法而该对象没有这个方法那么在编译时,编译器是无法发现的,只能到运行时由 JVM 抛出异常。

 



© 著作权归作者所有

关河

关河

粉丝 17
博文 60
码字总数 71630
作品 0
南京
程序员
私信 提问
【Java学习路线】新手该如何一步步的学习 Java

新手该如何一步步的学习 Java? 如果真的想学Java,最好要循序渐进,有章有法的学习它! 今天小慕就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容。 首先,给大家分享一张以 企业...

Eddie_yang
2018/11/15
2.3K
0
Java基础之反射(非常重要)

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道...

Java-老刘
2018/05/15
327
0
【免费】全网独家:详解Java反射机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/silencezwm/article/details/85115991 【免费】全网独家:这是一份非常值得珍藏的Android知识体系!!! 本文...

silencezwm
2018/12/20
0
0
那些年,关于 Java 的那些事儿

版权声明:Follow your heart and intuition. https://blog.csdn.net/qq_35246620/article/details/78695893 温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,...

维C果糖
2017/12/02
0
0
2013年个人计划

2013关键词: 思考,成长,责任 2013年要做的几件事情: 1. 生活与责任 1. 三十而立,在30岁前完成结婚这件大事。成家后希望自己能有足够的能力承担起一个家庭的责任。做一个有责任心的丈夫,...

长平狐
2013/06/17
145
0

没有更多内容

加载失败,请刷新页面

加载更多

Python 开发植物大战僵尸游戏

作者:楷楷 链接:https://segmentfault.com/a/1190000019418065 开发思路 完整项目地址: https://github.com/371854496/pygame 更多好玩有趣的python,尽在公众号「Python专栏」,后台回复...

上海小胖
51分钟前
5
0
JVM优化之逃逸分析与分配消除

要了解逃逸分析背后的基本原理,我们先来看下这段有问题的C代码——当然这个是没法用Java来写的: 这段C代码在栈上创建了一个int类型的变量,然后把它的指针作为函数的返回值返回了。这样做是...

onedotdot
今天
3
0
最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
6
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
12
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部