正常情况下,单纯的做开发是接触不到反射机制的(额,当然并不排除例外的情况了)。下面我就对我学到的反射方面的知识做一个小小的总结,旨在复习和以后的查看。


原理分析:
所谓反射就是将一个类当做我们研究的对象,进行分解,获取其中的内容的过程。其核心就是Class类,他是所有类的研究的对象,基于Class我们就可以获取一个类的字节码,进而获取想要的值。

目标类(待解刨的类)



package reflect;public class Person {public Person(){}private String name;public int address;public int getAddress() {return address;}public void setAddress(int address) {this.address = address;}public void setName(String name) {this.name = name;}public Person(String name ){this.name = name;}public String getName(){return this.name;}private Person(int name){System.out.println("这里是私有的带有参数的构造方法!");}public void eat(){System.out.println("吃饭!");}public void drink(String name){System.out.println("正在喝 :"+ name);}public void purchase(String address ,int [] number , String [] item){System.out.println("这个人在  " + address +"  买了 "+item +"  分别  "+ number+" 个!");}private String flay(String tool){return "I Can Flay By "+ tool;}public static String spend(String money){System.out.println("我只能够花费 "+money +"钱!");return "你造吗?";}public static void main(String[] args) {System.out.println(args[0]);}}

反射构造方法小例子


package reflect;import java.lang.reflect.Constructor;import org.junit.Test;public class ReflectConstructor {/*** 反射得到无参的构造函数的方法* @throws Exception*/@Testpublic void reflect1() throws Exception{Class cls = Class.forName("reflect.Person");Constructor c = cls.getConstructor(null);Person person = (Person) c.newInstance(null);System.out.println("反射得到的结果是:"+ person.toString());}/*** 反射出带有参数的构造方法* @throws Exception*/@Testpublic void reflect2() throws Exception {Class cls = Class.forName("reflect.Person");Constructor c = cls.getConstructor(String.class);Person person = (Person) c.newInstance("Name");System.out.println("反射获得的有参的结果是:"+ person.getName());}/*** 反射出私有的带有参数的构造方法* @throws NoSuchMethodException* @throws Exception*/@Testpublic void reflect3() throws NoSuchMethodException, Exception {Class cls = Class.forName("reflect.Person");Constructor c = cls.getDeclaredConstructor(int.class);//java语言默认私有的方法是不能被外界访问的到的,但要进行强制的访问需要加上一层权限c.setAccessible(true);Person person = (Person) c.newInstance(201492115);System.out.println("反射出私有的带有参数的构造方法!"+ person.toString());}}

反射所有方法的小例子


package reflect;import java.lang.reflect.Method;import org.junit.Test;public class ReflectMethods {/*** 反射测试一个无参的方法* public void eat()* @throws Exception*/@Testpublic void feflect1() throws Exception {Class cls = Class.forName("reflect.Person");Method method =cls.getMethod("eat", null);System.out.println(method.toString());method.invoke(new Person(), null);method.invoke(cls.newInstance(), null);}/*** 反射测试一个带有参数的方法* public void drink(String name)* @throws Exception*/@Testpublic void reflect2() throws  Exception {Class cls = Class.forName("reflect.Person");Method method =cls.getMethod("drink", String.class);System.out.println(method.toString());method.invoke(new Person(), "中国凉茶");method.invoke(cls.newInstance(), "中国凉茶");}/*** 反射测试含有多个复杂类型的参数的方法* public void purchase(String address ,int [] number , String [] item)* @throws Exception*/@Testpublic void reflect3() throws Exception {Class cls = Class.forName("reflect.Person");Method method = cls.getMethod("purchase", String.class,int[].class,String[].class);method.invoke(cls.newInstance(), "大连",new int[]{1,2,3},new String[]{"鱿鱼","贝壳","螃蟹"});}/*** 反射测试一个带有返回值的不含参数的方法* public String getName()* @throws Exception*/@Testpublic void reflect4() throws Exception {Class cls = Class.forName("reflect.Person");Method method = cls.getMethod("getName", null);String result = (String) method.invoke(cls.newInstance(), null);System.out.println("测试带有返回值的无参的方法,所得的结果是: "+result);}/*** 反射测试私有含参数的方法* private String flay(String tool)*/@Testpublic void reflect5() throws Exception {Class cls = Class.forName("reflect.Person");//对于私有的方法只能通过getDeclaredMethod方式得到Method method = cls.getDeclaredMethod("flay", String.class);//记得强制将访问人权限提升起来到"可以访问的到"method.setAccessible(true);String result = (String) method.invoke(cls.newInstance(), "蝙蝠侠的风衣!");System.out.println("反射测试私有的含参数的方法的结果是: "+ result);}/*** 反射测试私有的含参数的静态的方法* public static String spend(String money)*/@Testpublic void reflect6() throws Exception {Class cls = Class.forName("reflect.Person");//对于静态的方法只能通过getDeclaredMethod方式得到Method method = cls.getDeclaredMethod("spend", String.class);String result = (String) method.invoke(cls.newInstance(), "100000000000000元人民币!");System.out.println("反射测试私有的含参数的方法的结果是: "+ result);}/*** 反射测试主方法* public static void main(String[] args) * @throws Exception*/@Testpublic void reflect7() throws Exception {Class cls = Class.forName("reflect.Person");Method method = cls.getMethod("main",String[].class);method.invoke(null, (Object)new String[]{"A","B","C"});}}

反射字段值的小例子


package reflect;import java.lang.reflect.Field;import org.junit.Test;public class ReflectField {/*** 反射测试字段(属性)的值* public int address* @throws Exception*/@Testpublic void reflect1 () throws Exception {Class cls = Class.forName("reflect.Person");Field field = cls.getField("address");String result = field.getName();System.out.println("反射所得的字段的结果是:"+result);}/*** 反射测试私有的属性(字段)的结果* private String name * @throws Exception*/@Testpublic void reflect2() throws Exception {Class cls = Class.forName("reflect.Person");Field field = cls.getDeclaredField("name");field.setAccessible(true);String result = field.getName();System.out.println("反射测试所得的私有的字段(属性)的值为:"+ result);}}

我的总结


  • 全部的反射方法均交给JUnit测试通过,并没有发现出错的地方
  • 反射是一个比较灵活的方式,具体情况一定要灵活的变通
  • 对于私有的变量或者方法,要想访问到其值,就必须打开访问的权限即设置为setAccessable(true);
  • 对于框架的运行,需要给出一个类的完整名称(包含完整的包名),这样才不会出错!

Java 学习之反射机制“解刨”分解类,并获取内容!相关推荐

  1. [java学习] java_反射机制

    摘自http://baike.baidu.com/view/3454964.htm#5 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-r ...

  2. Java语言基础-反射机制、正则表达式

    反射机制 反射机制是在运行状态中,对于任意一个类,都能知道这个类(class文件)的所有属性和方法. 对于任意一个对象,都能调用它的任意一个方法和属性. 这种动态获取信息以及动态调用对象的方法的功能称 ...

  3. JAVA基础--JAVA中的反射机制详解

    JAVA反射机制     JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能 ...

  4. 根据实例详解Java中的反射机制

    概念: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java ...

  5. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  6. Java反序列化之反射机制

    目录 前言 Java反射机制 反射机制方法 指定构造方法生成实例 执行私有方法 总结 前言 每次听到大佬在讲或者看论坛等一些方式学java反序列化漏洞时,都会有一个词叫做反射机制,大佬顺势借着这个词, ...

  7. Java中的反射机制详讲

    Java中的反射机制详讲 1.反射机制_介绍_Class对象获取 2.反射机制_动态操作_构造器_方法_属性 3.动态编译_DanamicCompile_反射调用main方法问题 好文推荐:排序.查找 ...

  8. java 有哪些反射机制_Java 的反射机制你了解多少?

    不知道多少次听说过了Java反射机制的使用,比如:Spring 框架如何实例化IoC容器中的Bean,编码过程中如何动态的清理对象中的字段信息等等.工作中只是听说.看同事们编码实践,但是自己却只是概念 ...

  9. java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析

    什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功 ...

最新文章

  1. SAP WM 共用同一个仓库号的2个存储地点之间转库
  2. UA MATH565C 随机微分方程V Markov Family简介
  3. 一行代码求两个数的最大公约数
  4. python tcp协议加代理_python实现简单的TCP代理服务器
  5. android 视频监控相关(打包下载)
  6. oracle 临时表空间的增删改查
  7. mysqlierror php_php操作mysqli(示例代码)
  8. 自带python库的环境软件_pyenv虚拟环境管理python多版本和软件库
  9. 二十年后我发明了保姆机器人作文_我想发明保姆机器人作文500字
  10. 2017-2018论文更新
  11. Fiddler的安装和使用教程(详细)
  12. Qt绘制简单的风向玫瑰图代码
  13. 软件测试技术之项目上线流程
  14. NBAapi完全免费啦!
  15. 【分库分表ShardingSphere】
  16. 关于mysql的题目_关于MySQL的经典例题50道 答案参考
  17. cocos creater 使用.max文件/.max文件转换为.fbx文件
  18. 深入理解 OpenStack Neutron:VXLAN
  19. vue-awesome-swiper 设置autoHeight,最后不满一页也占了一页
  20. EasyNVR流媒体直播之:零基础实现摄像头的全平台直播 (一)内网直播的实现...

热门文章

  1. python画相关性可视化图_Python可视化16matplotlibseborn-相关性热图(correlation heatmap)...
  2. android执行lua脚本的方法,从Android应用程序调用Lua脚本
  3. 投资理财web后端系统_银行理财产品有风险吗?最大风险是什么?
  4. oracle 查看白名单,oracle配置访问白名单教程
  5. mysql 声明时间变量_MySQL如何声明一个datetime变量?
  6. go语言 gosched
  7. Python URL编码
  8. reStructuredText
  9. linux chown
  10. linux开源开发板 软硬件资料,LeMaker Guitar开源开发板安装系统镜像、Linux 系统快速指南 | 乐美客开源开发板社区...