`
eric_weitm
  • 浏览: 235963 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 编程的动态性

    博客分类:
  • java
阅读更多
Java 编程的动态性
参考资料:IBM开发者资料
参考地址 http://www.ibm.com/developerworks/cn/java/j-dyn0429/
一 类加载器
C语言程序执行过程:编译、链接(生成可执行文件)、操作系统的装载程序将其装入内存(建立进程)来运行
java程序的执行:编译、加载、在虚拟机中执行
新加载的类与其他类的链接由jvm来完成,所以java可以实现动态的链接,即在程序已经运行起来之后决定更新哪些模块、使用哪些模块(可以实现不停机而更新功能)。
java的这种机制与C++的dll的区别是,前者完全动态,允许在程序运行的时候改变代码的逻辑、后者所谓的动态在代码逻辑上来讲是静态的(使用的条件、功能的组合要硬编码)。
如:
用户输入了A 则加载A模块,否则不加载
这样一段逻辑,对于A模块而言它是动态的,但是对于加载的这个逻辑而言却是固定的

java的类加载器可以便于实现程序内的空间分离、增强程序的安全性和健壮性。如通过使用不同的加载器可以实现用户程序无法更改系统核心程序、也可实现多个用户空间共享代码(此部分代码放到上层加载器即可)。
这个估计是借鉴了OS中的内核空间和用户空间的概念,一个应用程序挂了很容易,但是想用一个应用程序来把整个OS搞挂(系统无法继续运行)不太容易。同样道理,在现实中想用一个java应用程序来搞挂jvm,好像也是
异常的艰难。如果要开发一个基础的框架(如新的脚本语言),那么如何来保证这种安全性就显得十分的重要。

二 反射(灵活、但是会影响性能)
jvm中的每个Class都有足够的hook让用户来用,所以如果你想改变一个初始化时设置的值成为可能(通过源代码的话只能硬编码)。另外、利用反射用户可以在代码中直接使用之前已经在JVM中实现的模块。
一个实际的使用场景:
假设 我用java实现了一种新的脚本语言 xxx,采用的是编译执行而不是解释执行(为了效率),那么我该如何实现 在XXX脚本中定义过的函数可以被后来的函数使用呢?
如果是解释执行很简单,记录每个内部提供的库函数和定义过的xxx脚本函数的地址,之后在解释新的xxx脚本函数调用时,依次hashmap到相应的函数即可。但是现在xxx脚本是编译型的,
我必须保证用户定义的XX脚本函数 aaa()要马上生效,即当扫描过aaa()之后就要求将它编译、不仅要编译、而且要链接到系统中(这样后面的xxx脚本bbb()中才能使用aaa()函数),由于要链接到系统中的代码是未知的,
要用到哪些其他的库也未知,所以C++是解决不了这个问题的(所以用C++实现的脚本都是解释型的)、而java的类加载器和反射就可以满足这种需要。
顺便说一下:有人认为java比C++慢,为什么还用java来实现脚本语言?java在运行时是否真的比C++慢我姑且不说(在使用JIT的情况下还真的不好说、而且C++可能快、但是我们写出来的C++却不一定快、和程序员
的水平有关系啊),要知道我们整个系统的速度是体现在脚本上的。同样的一个脚本函数aaa(),如果是用C++实现,那么我需要解释每一个语句,之后转化为内部定义的库函数指针、再之后才是真正的函数的执行。
而如果此脚本是用java实现的,那么我的每个脚本函数在运行时跑的都是.class文件,省去了每次都要解释指令的步骤,所以单从这里来看用java来实现脚本语言确实是可能更快的。除非我们相信自己可以做出来比jvm更牛X的虚拟机,不然我们有理由选择java来实现脚本语言。

三 修改byteCode
不仅用户可以使用jvm中已经载入的Class,用户甚至可以在JVM运行的过程中修改byteCode、并且将新的byteCode重新加载(类似于C里面的编译、连接、装载)
Javassist是一种可以改变bytecode的库、如可以在每个方法被调用前添加统计语句(bytecode的层面上)
PS:这种库适合于实现基础的平台,难怪现在基于java的平台如此之多

本文写于 2011年4月
分享到:
评论

相关推荐

    Java编程的动态性

    介绍Java的动态性,涉及反射的很多实例。这里是第二部分,第一部分类的加载也很不错....

    Java编程思想(完整版)

    Java除了可解决传统的程序设计问题以外,还能解决World Wide Web(万维网)上的编程问题。 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 ...

    Java编程开发培训视频教程(小白到大神)

    Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。,因此Java语言具有功能强大和简单...

    Java编程开发培训 基础入门到精通

    Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。,因此Java语言具有功能强大和简单...

    Java编程开发培训视频教程【从入门到大师】

    Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。,因此Java语言具有功能强大和简单...

    Java经典编程源码基础例程300.zip

    Java经典编程源码例程,可以做为你的学习设计参考。 第1章 Java语言概述 1 实例001 输出“Hello World” 2 实例002 输出控制台传递的参数 2 实例003 输出由“*”组成的三角形 3 实例004 输出符号表情 5 第2章 ...

    Java优化编程(第2版)

    1.11 java编程实践 1.11.1 访问实例与类中变量的规则 1.11.2 引用类中的静态变量与方法的 …… 小结 第4章 java核心类与性能优化 4.1 散列表类与性能优化 4.1.1 线程同步散列表类 4.1.2 设置arraylist初始化容量 ...

    非常详细的JAVA编程语言系统学习从基础到精通教程

    Java是一门面向对象的编程语言,不仅...Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等

    java 编程入门思考

    附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速方法 D.3.1 常规手段 D.3.2 依赖语言的方法 D.3.3 特殊...

    Java语言编程基础完整全套教学课件详细版

    Java是一门面向对象的编程语言,不仅...Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等

    Java编程题自动评分技术的研究与实现_郑燕娥.caj

    识要点的正则表达式匹配评分技术等关键技术,实现了Java编程题自动评分技 术及原型系统。评分方式兼顾了可执行代码的动态测试与源程序的静态分析, 实现了对不同的考生程序采用以下两种评分方法: (1)对于可以通过...

    有关JAVA的译文 Clojure:“挑战”Java编程语言

    Clojure是一个JVM的动态函数式语言,最近发布了1.0版本,版本中Clojure提供了一个...Clojure语言是一个JVM(包括Groovy,Jython和JRuby等语言)的新语言,它提供了活力,简洁得代码,并且与Java具有良好的相互操作性。

    Java数据编程指南

    John Bell ,Carl Calvert Bettis等 【译 者】 戴英 张晓晖 王辉 等 【丛 书 名】 乐思公司编程指南系列 <br>http://images.china-pub.com/ebook/5221/shupi.jpg<br><br>Java是一种功能强大的编程平台,...

    Java自学编程全套干货教学

    Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 。 Java是一个面向对象的语言。对...

    java手册中英文java8,java9手册

    太阳微系统对Java语言的解释是:“Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言” Java不同于一般的编译语言或解释型语言。它首先将源代码编译成...

    OSGi Java 编程资料

    学习OSGi时搜集的资料 OSGi(Open Services Gateway Initiative,开放服务网关协议)提供了一个面向服务组件的编程模型,基于 OSGi 编程,具有模块化,标准化,面向服务,动态性,易复用,易扩展,易部署等诸多优点

    Java8的官方文档

    这是基于Java8的官方文档,使用Easy ...Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

    Java学习必要的软件包

    Java是一门面向对象编程...Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 [2] 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 [3] 。

    C++编程思想(第2版)_第1卷_标准C++引导

    Bruce Eckel 《Thinking in Java》(Java编程思想)作者。Eckel有20年专业编程经验,并自1986年起教育人们如何撰写面向对象程序,足迹遍及全球,成为一位知名的 C++教师和顾问,如今兼涉Java。他是C++标准委员会拥有...

    Java数据库编程宝典3

    12.2 使用servlet创建动态Web页面 12.2.1 创建一个简单的servlet 12.3 创建和配置Lo9in servlet 12.3.1 实现会员Web站点 12.3.2 创建Login页面 12.3.3 创建servlet 12.3.4 部署 12.4 使用JSP 12.4.1 在JSP...

Global site tag (gtag.js) - Google Analytics