`

jvm局部热加载jar包示意代码

 
阅读更多

 一、UML图

抽空再画

二、可行性验证的示意代码

public class TaskManager {

	public static void main(String[] args) throws Exception {
		ClassLoader mycl = MyClassLoader.getAnotherSysClassLoader();
		System.out.println("========invoke directly================");
		TestBean.main(args);
		System.out.println("========invoke by myClassLoader========");
		Class testBeanClazz = mycl
				.loadClass("com.alibaba.china.industry.task.common.TaskLoader");
		Object obj = testBeanClazz.newInstance();
		Method[] ms = testBeanClazz.getMethods();
		Method m = getInvokeMethod(mycl, testBeanClazz);
		if (m == null) {
			System.out.println("error!");
			return;
		}
		Object target = obj;
		
		if(Modifier.isPublic(m.getModifiers())){
			m.invoke(Modifier.isStatic(m.getModifiers())?testBeanClazz:obj, new Object[] { args });
		}
		System.out.println("========invoke directly 2================");
		TestBean.main(args);
	}

	private static Method getInvokeMethod(ClassLoader cl, Class clazz)
			throws ClassNotFoundException {
		Method[] ms = clazz.getMethods();
		Method m = null;
		for (Method method : ms) {
			Class annClass = cl
					.loadClass("com.alibaba.china.industry.task.common.InvokeMethod");
			if (method.isAnnotationPresent(annClass)) {
				m = method;
			}
		}
		return m;

	}

	private static class MyClassLoader extends URLClassLoader {
		private static URLClassLoader scl = (URLClassLoader) getSystemClassLoader();

		private MyClassLoader() {
			super(scl.getURLs(), null);
		}

		static ClassLoader getAnotherSysClassLoader() {
			return new MyClassLoader();
		}
	}

}

 

public class TaskLoader {

	/**
	 * @param args
	 */
	@InvokeMethod
	public static void main(String[] args) {
		System.out.println("TestBean classLoader:"+TaskLoader.class.getClassLoader());
		System.out.println("String classLoader:"+String.class.getClassLoader());
	}

}

 

public class Server {
	private ServerSocket server;
	private static final int ServerPort = 8765;// 要監控的port
	public static void main(String[] args){
		Server server = new Server();
		server.listen();
	}
	public Server() {
		try {
			server = new ServerSocket(ServerPort);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void listen() {
		TaskDirector taskManager = null;
		Socket socket;
		java.io.BufferedInputStream in;

		System.out.println("server is already!");
		while (true) {
			socket = null;
			try {
				synchronized (server) {
					socket = server.accept();
				}
				
				in = new java.io.BufferedInputStream(socket.getInputStream());
                byte[] b = new byte[1024];
                String data = "";
                in.close();
                in = null;
                socket.close();
                
                taskManager = new TaskDirector();
                taskManager.start();
			} catch (Exception e) {

			}
			
		}
	}

	public static class TaskDirector extends Thread {
		TaskDirector() {
			super();
			setDaemon(true);
		}

		public void run() {
			try {
				TaskManager.main(null);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

 

public class Client {
	 private String address = "127.0.0.1";// 連線的ip
	    private int port = 8765;// 連線的port
	 
	    public Client() {
	 
	        Socket client = new Socket();
	        InetSocketAddress isa = new InetSocketAddress(this.address, this.port);
	        try {
	            client.connect(isa, 10000);
	            BufferedOutputStream out = new BufferedOutputStream(client
	                    .getOutputStream());
	            // 送出字串
	            out.write("Send From Client ".getBytes());
	            out.flush();
	            out.close();
	            out = null;
	            client.close();
	            client = null;
	 
	        } catch (java.io.IOException e) {
	            System.out.println("Socket連線有問題 !");
	            System.out.println("IOException :" + e.toString());
	        }
	    }
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Client();
	}

}

 

 

 

 

 

 

分享到:
评论

相关推荐

    springboot+java类热加载

    在热加载场景下,JarinJAR使得在运行时能够动态替换内部的JAR,达到更新代码的目的。然而,JarinJAR并不直接支持热加载,需要配合类加载器的定制工作。 **动态编译**:在热加载过程中,可能会涉及到对源代码的动态...

    动态加载jar包

    动态加载jar包是一种在程序运行时按需引入外部库或者组件的技术,这使得应用程序更加灵活,可以适应不同的环境和需求。这种技术广泛应用于插件系统、框架开发以及服务升级等场景,因为它允许程序在不重启的情况下...

    MyEclipse热加载jar包.zip

    总的来说,MyEclipse热加载jar包是提升Java开发效率的一个利器,特别是对于需要频繁调试和修改代码的项目。通过理解和正确配置这个资源,开发者可以节省大量时间,更加专注于代码的编写和优化,而不必反复进行繁琐的...

    jvm堆内存溢出jar包代码

    jvm堆内存溢出jar包代码

    Java URLClassLoader动态加载jar包1

    `URLClassLoader`会读取这个JAR文件,并将其包含的类加载到当前运行的Java虚拟机(JVM)中。 在代码中,首先创建了一个`URL`对象,表示JAR文件的路径。接着,通过`URLClassLoader`的构造函数,传入URL数组来实例化...

    java之jvm学习笔记八(实践对jar包的代码签名)

    本文将深入探讨Java的JVM如何实践对JAR包的代码签名。 代码签名是一种验证软件来源可靠性的方法,它通过数字签名技术为JAR文件提供了一种认证机制。在Java中,我们可以使用Java自带的工具如`jarsigner`来完成这个...

    jar包隔离代码.zip

    2. OSGi(Open Service Gateway Initiative)框架:OSGi提供了模块化系统,允许在同一JVM中动态加载和卸载不同的jar包版本,实现类的隔离。 3. Spring Boot的ClassPathScanningCandidateComponentProvider:Spring ...

    java 动态加载jar包

    在Java编程语言中,动态加载jar包是一种常见的需求,它允许程序在运行时根据需要加载新的功能或更新现有的模块,增强了软件的灵活性和可扩展性。动态加载jar包技术主要涉及Java的反射机制、类加载器和插件系统。下面...

    kotlinx-coroutines-io-jvm-0.1.1.jar

    kotlinx-coroutines-io-jvm-0.1.1.jar

    javareble 热加载jvm插件

    JavaRebel是一款强大的JVM热加载插件,它极大地提升了Java开发者的生产力,尤其是在进行Web应用编程时。这款工具允许开发者在代码修改后立即看到结果,而无需重新启动服务器或重新部署应用程序。这一特性显著减少了...

    动态加载jar包的实现

    在Java编程环境中,动态加载jar包是一项重要的技术,它允许我们无需重启服务器就能引入新的功能或更新已有的类。这在大型系统维护和迭代中尤为关键,因为它提高了系统的灵活性和可扩展性。以下是对"动态加载jar包的...

    C++调用java jar包测试代码

    标题 "C++调用java jar包测试代码" 描述了一个跨语言交互的场景,其中C++程序通过调用Java编译后的jar包来执行特定功能。这个过程涉及到多个技术点,包括Java的编译和打包,C++的编程以及两者之间的接口调用。 1. *...

    xgboost jvm-package jar包

    xgboost jvm-package jar包xgboost jvm-package jar包

    如何在WebSphere中解决jar包冲突.doc

    * 使用不同的类加载器:在 WebSphere 中,我们可以使用不同的类加载器来加载不同的 jar 包。例如,我们可以使用 WebSphere Extensions Class loader 来加载 WebSphere 的一些 runtime 类,而使用 Application Module...

    metrics-jvm-3.1.5-API文档-中英对照版.zip

    赠送jar包:metrics-jvm-3.1.5.jar; 赠送原API文档:metrics-jvm-3.1.5-javadoc.jar; 赠送源代码:metrics-jvm-3.1.5-sources.jar; 赠送Maven依赖信息文件:metrics-jvm-3.1.5.pom; 包含翻译后的API文档:...

    JAVA动态加载JAR zip包

    在Java编程中,动态加载JAR或ZIP包是一项重要的技术,它允许程序在运行时根据需求加载外部库,而不是在编译时静态地链接。这种技术对于实现插件化、模块化系统,或者处理频繁更新的组件非常有用。下面将详细讲解如何...

    jar包差异比较器

    每个类文件(.class)包含了Java源代码编译后的字节码,这些字节码是Java虚拟机(JVM)执行的基础。当比较两个JAR包时,主要关注的是类文件的变化,因为这是直接影响程序行为的部分。 "jar包差异比较器"的使用方式...

    java语言开发jar包_jar包_java_

    2. **优化加载速度**:由于JAR文件是压缩的,因此它们在被Java虚拟机(JVM)加载时可以更快地提取和解压,提高了程序的启动效率。 3. **版本控制**:不同的JAR包可以代表不同版本的库,这有助于管理项目依赖和版本...

    java 类从哪个jar包加载的

    Bootstrap ClassLoader负责加载JRE核心库(如rt.jar),Extension ClassLoader负责加载JRE扩展目录下的JAR包,而App ClassLoader则加载应用程序的CLASSPATH中的类和JAR包。 当JVM需要加载一个类时,它会委托给合适...

    深入Java虚拟机_002_深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

    根类加载器,也称为bootstrap class loader,是JVM内置的最基础的类加载器,由C++实现,负责加载JDK核心库,如rt.jar,这些库位于JRE的lib目录下,包含了Java的基础类和API。 扩展类加载器,又叫extension class ...

Global site tag (gtag.js) - Google Analytics