DCEVM,Java类动态替换初级实验说明

概述

DCEVM,全称Dynamic Code Evolution,一个JVM补丁程序,其目的就是实现运行时的类替换。最新的项目地址为:https://dcevm.github.io/

下面将从安装、验证、搭建测试环境、测试等几个方面进行简要说明。

安装

首先登录网址:https://dcevm.github.io/,站点中明确给出了Binaries(二进制程序)的下载链接,该项目分为两个版本的发布程序,一个是light版本,另一个是full,区别在于full版本支持更多的特性,但对于一般的开发来说,light版本足矣,更多内容详情请参考原文。

二进制的文件下载后能够从中解压出一个带installer的jar文件,这个就是用于安装补丁文件的安装程序,运行方式如下:

java -jar installer.jar

如在Linux/Unix环境下运行,请命令最前方加sudo。程序运行后,会出现如下的安装画面:

接下来通过点击按钮“Add installation directory”选择要打上补丁的JAVA_HOME目录,选择完成后,分别点击“Replace by DCEVM”和“Install DCEVM as altjvm”来为目标JDK打上DCEVM补丁。

验证

安装完成后的效果,应该与上图类似,接下来我们可以通过控制台来进行安装验证。打开控制台终端程序,然后键入以下命令:

java -version

如果安装无误的话,则会出现以下信息,重点是最后一句话“Dynamic Code Evolution”。

java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Dynamic Code Evolution 64-Bit Server VM (build 24.71-b01-dcevmlight-2, mixed mode)

搭建测试环境

接下来我们可以通过一个具体的实验来测试动态加载的效果,在测试前,先需要准备好相应的测试环境。

tomcat

到http://tomcat.apache.org去下载一个Tomcat服务器程序,这里选择的版本是7。解压后在其主目录的webapps下创建一个DCEVM目录,然后按照以下结构创建一个Web应用:

DCEVM/

├── META-INF

└── WEB-INF

└── lib

Java项目

从eclipse中创建一个Java项目,目录结构如下:

/Users/i318043/z/workspace/eclipse/ExperimentDCEVM

├── WebContent

│   └── WEB-INF

│       └── classes

│           └── com

│               └── github

│                   └── dcevm

│                       └── test

└── src

└── com

└── github

└── dcevm

└── test

其中.project.xml和.classpath文件内容分别如下,该内容仅供参考,具体环境需要按需进行调整:

<?xml version="1.0" encoding="UTF-8"?>

<classpath>

<classpathentry kind="src" path="src"/>

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>

<classpathentry kind="output" path="WebContent/WEB-INF/classes"/>

</classpath>

这里需要注意的是linkedResources,这是一个虚拟目录,其指向的是Tomcat中的DCEVM,目的是为了让编译后的二进制class文件直接输出到Tomcat中。

<?xml version="1.0" encoding="UTF-8"?>

<projectDescription>

<name>ExperimentDCEVM</name>

<comment></comment>

<projects>

</projects>

<buildSpec>

<buildCommand>

<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>

<triggers>auto,full,incremental,</triggers>

<arguments>

<dictionary>

<key>LaunchConfigHandle</key>

<value>&lt;project&gt;/.externalToolBuilders/ExperimentDCEVM build.xml [Builder].launch</value>

</dictionary>

</arguments>

</buildCommand>

<buildCommand>

<name>org.eclipse.wst.common.project.facet.core.builder</name>

<arguments>

</arguments>

</buildCommand>

<buildCommand>

<name>org.eclipse.jdt.core.javabuilder</name>

<arguments>

</arguments>

</buildCommand>

</buildSpec>

<natures>

<nature>org.eclipse.jdt.core.javanature</nature>

<nature>org.eclipse.wst.common.project.facet.core.nature</nature>

</natures>

<linkedResources>

<link>

<name>WebContent</name>

<type>2</type>

<location>/Users/Woody/z/apache-tomcat-7.0.61/webapps/DCEVM</location>

</link>

</linkedResources>

</projectDescription>

至此,环境搭建完毕,接下来就可以进行编码测试了。

测试

在测试过程中,我们一共需要准备三个程序文件,两个Java和一个JSP;另外还需要一个配置文件web.xml;此外,如果需要使用Ant进行编译的话,可以在Java项目的图标上点击右键,选择Export,然后选择Ant Buildfiles即可自动生成build.xml。

源码清单

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.xhtml</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>welcome.jsp</welcome-file>
    </welcome-file-list>

</web-app>

welcome.jsp

<html>
<head></head>
<body>
<h1>hi there!</h1>
<jsp:useBean id="hwBean" class="com.github.dcevm.test.HelloWorld"></jsp:useBean>
<jsp:getProperty property="greetings" name="hwBean"/>
<jsp:useBean id="ncBean" class="com.github.dcevm.test.NewClass"></jsp:useBean>
<jsp:getProperty property="word" name="ncBean"/>
</body>
</html>

HelloWorld.java

package com.github.dcevm.test;

public class HelloWorld /*4.2*/ extends AbstractHelloWorld {

	public String getGreetings() {
		/*5.0, 5.2*/ System.out.println("... ||x|| ...");
		/*1*/ return "Hello tricky?".concat(" ").concat(_getGreeting1()).concat(" ").concat(_getGreeting2()).concat(getAbstractGreeting());
	}

	/*2.1*/ private String _getGreeting1() {
		return "damn it!";
	}

	/*2.2*/ private String _getGreeting2() {
		return "Why nobody mentions this trap!";
	}

}

/*4.1*/ abstract class AbstractHelloWorld {
	protected String getAbstractGreeting() {
		return "<abstract Y=good=Y greeting>";
	}
}
/*5.1*/ // ==> redefine auto-build approach

NewClass.java

package com.github.dcevm.test;

public class NewClass {

	public String getWord() {
		return "hmm ...";
	}
}

测试目标

  1. 修改既存类方法体,实现类自动替换
  2. 为既存类增加新的方法,实现类自动替换
  3. 创建新的抽象类,作为既存类的父类,并在子类中调研父类方法,实现父类与子类的自动替换
  4. 创建新类,并在JSP中调用新类的方法,实现新类的自动加载

测试步骤

  • JSP文件中注释掉所有的<jsp>标签
  • 删除NewClass
  • 注释掉2.1、2.2和4.1、4.2标记的代码
  • debug模式启动Tomcat,命令为:sudo ./catalina.sh jpda run
  • eclipse中开启远程调试
  • JSP中打开与hwBean,并对代码中带有标记1的方法进行修改,完成测试目标1
  • 开启代码中2.1和2.2标记方法,完成测试目标2
  • 开启4.1和4.2,完成测试目标3
  • 开启JSP中与ncBean相关代码,并加入NewClass.java文件,完成测试目标4

关于Builders

源码中添加了Ant编译,通过鼠标右键点击项目,选择“Properties”,进入“Builder”,勾选掉“ExperimentDCEVM build.xml [Builder]”可以禁用Ant编译。PS:Ant编译主要针对使用eclipse的Java Builder不太适合的项目。

文档源码下载

http://download.csdn.net/detail/rcom10002/8612013

时间: 2024-08-29 00:08:29

DCEVM,Java类动态替换初级实验说明的相关文章

Java 类的热替换---转载

构建基于 Java 的在线升级系统 Java ClassLoader 技术剖析 在本文中,我们将不对 Java ClassLoader 的细节进行过于详细的讲解,而是关注于和构建在线升级系统相关的基础概念.关于 ClassLoader 的详细细节许多资料可以参考,有兴趣的读者可以自行研读. 要构建在线升级系统,一个重要的技术就是能够实现 Java 类的热替换 —— 也就是在不停止正在运行的系统的情况下进行类(对象)的升级替换.而 Java 的 ClassLoader 正是实现这项技术的基础. 在

(转)Java 类的热替换 —— 概念、设计与实现

构建基于 Java 的在线升级系统 对于许多关键性业务或者庞大的 Java 系统来说,如果必须暂停系统服务才能进行系统升级,既会大大影响到系统的可用性,同时也增加了系统的管理和维护成本.因此,如果能够方便地在不停止系统业务的情况下进行系统升级,则可以很好地解决上述问题.在本文中,我们将基于实例,对构建在线升级 Java 系统的基础技术和设计原则进行了深入的讲解.相信读者能够根据文中的技术构建出自己的在线升级系统来. Java ClassLoader 技术剖析 在本文中,我们将不对 Java Cl

Java 类的热替换 —— 概念、设计与实现

别人的一篇技术博客,直接摘抄过来,免得再查看找不到了(本人在看的过程中可能会对原文格式或文字有修改) 原文地址:http://blog.163.com/web_promise/blog/static/109631655201222804931240/ 在本文中,我们将不对 Java ClassLoader 的细节进行过于详细的讲解,而是关注于与构建在线升级系统相关的基础概念.关于 ClassLoader 的详细细节有许多资料可以参考,有兴趣的读者可以自行研读. 要构建在线升级系统,一个重要的技术

java类载入器——ClassLoader

Java的设计初衷是主要面向嵌入式领域,对于自己定义的一些类,考虑使用依需求载入原则.即在程序使用到时才载入类,节省内存消耗,这时就可以通过类载入器来动态载入. 假设你平时仅仅是做web开发,那应该非常少会跟类载入器打交道,但假设你想深入学习tomcatserver的架构,它是不可缺少的.所谓类载入器.就是用于载入Java类到Java虚拟机中,它负责读取Java字节码.并转换成java.lang.Class类的一个实例.使字节代码.class文件得以执行. 一般类载入器负责依据一个指定的类找到相

Java动态替换InetAddress中DNS的做法简单分析2

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.HttpURLConnection; import java.net.InetAddress;

Java动态替换InetAddress中DNS的做法简单分析1

在java.net包描述中, 简要说明了一些关键的接口. 其中负责networking identifiers的是Addresses. 这个类的具体实现类是InetAddress, 底层封装了Inet4Address与Inet6Address的异同, 可以看成一个Facade工具类. A Low Level API, which deals with the following abstractions: Addresses, which are networking identifiers,

JSP-讲解(生成java类、静态导入与动态导入)

一.JSP技术简介 JSP是Java Server Page的缩写,它是Servlet的扩展,它的作用是简化网站的创建和维护. JSP是HTML代码与Java代码的混合体. JSP文件通常以JSP或JSPX的扩展名. JSP拥有自己的语法. JSP形式上像HTML,但本质上是Servlet. JSP的出现,使得将Web开发中的HTML与业务逻辑代码有效分离成为可能.通常JSP只负责生成动态的HTML文档,而业务逻辑由其他Java组件如JavaBean来实现.JSP可以通过Scriptlet来访问

Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类   =========================== ?Copyright 蕃薯耀 2017年9月25日 http://www.cnblogs.com/fanshuyao/ 一.问题描述 很多对外网站的某些内容都需要过滤敏感词,避免政治与色@情上的问题. 二.解决方案 使用词库进行匹配过滤成 * (星号) Java 敏感词工具类及敏感词词库见附件. 1.下载后,有几个类,主要为WordFilter 这个工具类,使用方法如下

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个