如何彻底理解反射详解编程语言
什么是JVM,Java的虚拟机,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容器就会根据你的需求去动态加载,你的程序就能健壮地运行。
实例说明反射是如何起作用的 首先准备两个很简单的业务类package reflection; public class Service1{ public void doService1(){ System.out.println("业务方法1") }
package reflection; public class Service2{ public void doService2(){ System.out.println("业务方法2") }非反射的方式 切换 不同的业务方法
package reflection; public class Test{ public static void main(String[] args){ // new Service1().doService1(); new Service2().doService2(); }
当需要从第一个业务方法切换到第二个业务方法的时候,使用非反射方式,必须修改代码,并且重新编译运行,才可以达到效果
使用反射方式,首先准备一个配置文件,就叫做spring.txt吧, 放在src目录下。 里面存放的是类的名称,和要调用的方法名。在测试类Test中,首先取出类名称和方法名,然后通过反射去调用这个方法。当需要从调用第一个业务方法,切换到调用第二个业务方法的时候,不需要修改一行代码,也不需要重新编译,只需要修改配置文件spring.txt,再运行即可。
spring.txt class = reflection.Service1 method = doService1
package com.java.test; import java.io.File; import java.io.FileInputStream; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.Properties; public class Test { public static void main(String[] args) throws Exception { File springConfigFile = new File("spring.txt"); Properties springConfig = new Properties(); springConfig.load(new FileInputStream(springConfigFile)); String className = (String)springConfig.get("class"); String methodName = (String) springConfig.get("method"); // 根据类名名称创建类对象 Class clazz = Class.forName(className); // 根据方法名称获取方法 Method method = clazz.getMethod(methodName); // 获取构造器 Constructor c = clazz.getConstructor(); // 根据构造器,构造出方法 Object service = c.newInstance(); // 调用对象的指定方法 method.invoke(service); }
使用这个例子,可以较好得理解反射的一个应用场景。
这也是Spring框架的最基本的原理,只是它做的更丰富,安全,健壮
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/13962.html
cjavamysqloracle相关文章
- Java反射机制及其使用
- 什么是反射机制?_java的反射是如何实现的
- C++反射 - 反射信息的自动生成
- 【说站】java 反射机制作用
- 【说站】java反射调用方法
- Java 8 的 java.util.function.* POJO 的反射新方法
- 反射(一)-常用方法及加载资源文件
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 反射获取系统的 Element[] dexElements )
- java复习基础篇——反射详解编程语言
- java基础之反射机制详解编程语言
- Java异常处理之InvocationTargetException(反射异常)详解编程语言
- [javaSE] 反射-动态加载类详解编程语言
- java反射机制详解编程语言
- java 反射机制详解编程语言
- 获取对象属性类型、属性名称、属性值的研究:反射和JEXL解析引擎详解编程语言
- Java反射访问操作数组
- 基于java中反射的总结分析
- asp.net反射减少代码书写量