极悦注册教程:Java反射教程实例讲解_极悦注册
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 极悦注册 极悦注册教程:Java反射教程实例讲解

极悦注册教程:Java反射教程实例讲解

更新时间:2019-12-31 09:49:07 来源:极悦 浏览1760次


  什么是反射?它的应用场景是什么?


  反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。

  重点:是运行时而不是编译时


  “反射”既然有“反”那么肯定有“正”,那么我们首先看一下正的一面


极悦注册教程:Java反射教程实例讲解


  假如你写了一段代码:Object o=new Object();


  运行了起来!


  首先JVM会启动,你的代码会编译成一个.class文件,然后被类加载器加载进jvm的内存中,你的类Object加载到方法区中,创建了Object类的class对象到堆中,注意这个不是new出来的对象,而是类的类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为你的对象分配内存,初始化也就是代码:new Object()。


  上面的流程就是你自己写好的代码扔给jvm去跑,跑完就over了,jvm关闭,你的程序也停止了。


  上面的程序对象是自己new的,程序相当于写死了给jvm去跑。假如一个服务器上突然遇到某个请求哦要用到某个类,哎呀但没加载进jvm,是不是要停下来自己写段代码,new一下,哦启动一下服务器,(脑残)!


  反射是什么呢?


  当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻,举个例子我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class tc = Class.forName("com.java.dbtest.TestConnection");通过类的全类名让jvm在服务器中找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出java的特性了!


  在spring框架中,会发现当你配置各种各样的bean时,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。


  对与框架开发人员来说,反射虽小但作用非常大,它是各种容器实现的核心。而对于一般的开发者来说,不深入框架开发则用反射用的就会少一点,不过了解一下框架的底层机制有助于丰富自己的编程思想,也是很有益的。


  知识剖析:


  java反射机制提供了以下几个功能:


  在运行时判断任意一个对象所属的类;


  在运行时构造任意一个类的对象;


  在运行时判断任意一个类所具有的成员变量和方法;


  在运行时调用任意一个对象的方法。


  反射涉及到四个核心类:


  java.lang.Class.java:类对象;


  java.lang.reflect.Constructor.java:类的构造器对象;


  java.lang.reflect.Method.java:类的方法对象;


  java.lang.reflect.Field.java:类的属性对象;


  反射工作原理


  反射的工作原理就是借助Class.java、Constructor.java、Method.java、Field.java这四个类在程序运行时动态访问和修改任何类的行为和状态。


  代码实现:


  常见问题:


  反射的特点


  优点


  灵活、自由度高:不受类的访问权限限制,想对类做啥就做啥;


  缺点


  性能问题:通过反射访问、修改类的属性和方法时会远慢于直接操作,但性能问题的严重程度取决于在程序中是如何使用反射的。如果使用得很少,不是很频繁,性能将不会是什么问题;


  安全性问题:反射可以随意访问和修改类的所有状态和行为,破坏了类的封装性,如果不熟悉被反射类的实现原理,随意修改可能导致潜在的逻辑问题;


  兼容性问题:因为反射会涉及到直接访问类的方法名和实例名,不同版本的API如果有变动,反射时找不到对应的属性和方法时会报异常;


  如何避免反射导致的性能问题?


  过多地使用反射,的确会存在性能问题,但如果使用得当,所谓反射导致性能问题也就不是问题了,关于反射对性能的影响,参照下面的使用原则,并不会有什么明显的问题:


  不要过于频繁地使用反射,大量地使用反射会带来性能问题;


  通过反射直接访问实例会比访问方法快很多,所以应该优先采用访问实例的方式。


极悦注册教程:Java反射教程实例讲解


       以上就是极悦注册机构小编介绍的“极悦注册教程:Java反射教程实例讲解”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。


  相关内容


  


  


  


  


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>