`
xuyan2680
  • 浏览: 31749 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

类加载器实现简单远程任务执行器示意代码(学习版)

阅读更多
本文所贴示意代码主要是学习使用。
任务接口:
package cs.classloader;
/**
 * 任务类接口 ,任何实现了此接口的类,都可以在服务端简单任务执行器中执行
 * */
public interface TaskIntf {

	void execute();
}

任务实现类:
package cs.classloader;

public class TaskIntfImp implements TaskIntf {
	
	static {
		System.out.println("我被加载了");
	}

	@Override
	public void execute() {
		System.out.println("我被执行了   我被"+this.getClass().getClassLoader()+"加载");
	}

}

类加载器:
package cs.classloader;

import java.io.File;
import java.io.FileInputStream;
/**
 * 自定义类加载器
 * */
public class NewClassLoader extends ClassLoader {
	private String currentRoot = null;

	public NewClassLoader(String userdir) {
		this.currentRoot = userdir;
	}

	public NewClassLoader() {
	}
	//根据类名从文件中读取类字节码
	public byte[] findClassBytes(String className) {
		if (currentRoot == null) {
			currentRoot = "";
		}
		try {
			String pathName = currentRoot + File.separatorChar
					+ className.replace('.', File.separatorChar) + ".class";
			FileInputStream inFile = new FileInputStream(pathName);
			byte[] classBytes = new byte[inFile.available()];
			inFile.read(classBytes);
			return classBytes;
		} catch (java.io.IOException ioEx) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public Class findClass(String name) throws ClassNotFoundException {

		byte[] classBytes = findClassBytes(name);
		if (classBytes == null) {
			throw new ClassNotFoundException();
		} else {
			return defineClass(name, classBytes, 0, classBytes.length);
		}
	}
	//根据传入的字节码 返回class信息
	@SuppressWarnings("unchecked")
	public Class findClass(String name, byte[] classBytes)
			throws ClassNotFoundException {

		if (classBytes == null) {
			throw new ClassNotFoundException("(classBytes==null)");
		} else {
			return defineClass(name, classBytes, 0, classBytes.length);
		}
	}
	//执行 实现了TaskIntf 接口的 任务类
	@SuppressWarnings("unchecked")
	public void execute(String codeName, byte[] code) {

		Class klass = null;
		try {
			klass = findClass(codeName, code);
			TaskIntf task = (TaskIntf) klass.newInstance();
			task.execute();
		} catch (Exception exception) {
			exception.printStackTrace();
		}
	}
}

服务端代码:
package cs.classloader;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服务端类,实现监听客户端请求
 * */
public class Server {

	private ServerSocket ss = null;
	private int port = 8067;
	private Socket sc = null;

	public Server() {
		try {
			ss = new ServerSocket(port);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void listener() {
		while (true) {
			try {
				sc = ss.accept();
				Thread t = new Thread(new TaskDo(sc));//交给任务处理线程处理
				t.start();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		Server s = new Server();
		s.listener();
	}
}
/**
 * 此类主要是读取客户端传来的字节码,并实现任务执行
 * */
class TaskDo implements Runnable {
	Socket s;
	InputStream is;
	OutputStream os;
	BufferedInputStream bis;
	byte[] b = null;

	public TaskDo(Socket s) {
		this.s = s;
		try {
			os = s.getOutputStream();
			is = s.getInputStream();
			bis = new BufferedInputStream(is);
			b = new byte[bis.available()];
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		try {
			read(b);
			execute(null, b);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				bis.close();
				is.close();
				s.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

	private void read(byte[] b) throws Exception {
		bis.read(b);
	}

	private void execute(String codeName, byte[] code) {

		NewClassLoader fileSystemClassLoader = null;

		try {
			fileSystemClassLoader = new NewClassLoader();
			fileSystemClassLoader.execute(codeName, code);
		} catch (Exception exception) {
		}
	}
}

客户端代码:
package cs.classloader;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 客户端类,负责读取实现了TaskIntf接口的类的字节码,并发送给服务端
 * */
public class Client {
	public static void main(String[] args) {

		try {
			for (int i = 0; i < 2; i++) {
				byte[] code = getClassDefinition("cs.classloader.TaskIntfImp");
				send(code);
			}
		} catch (Exception ex) {
		}
	}

	private static byte[] getClassDefinition(String codeName) {
		String userDir = System.getProperty("user.dir") + "\\bin";
		NewClassLoader fscl1 = null;

		try {
			fscl1 = new NewClassLoader(userDir);
		} catch (Exception fileNotFoundException) {
			fileNotFoundException.printStackTrace();
		}
		return fscl1.findClassBytes(codeName);
	}

	private static void send(byte[] b) {
		OutputStream os = null;
		Socket s = null;
		try {
			s = new Socket("127.0.0.1", 8067);
			os = s.getOutputStream();
			os.write(b);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				os.close();
				s.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

此示意代码主要是从客户端发送实现了特定接口的任务类的字节码发送给服务端执行.
1
0
分享到:
评论

相关推荐

    无源码APK调试方案之二

    具体来说,是在APK加载后、执行前,使进程处于一个等待状态,直至调试者发出特定信号后,才继续执行。这样做的目的是确保调试者可以在应用程序开始执行之前介入。 **流程:** 1. **修改Dalvik虚拟机:** - 修改`...

    基于CANoe的Bootloader上位机软件 下位机为飞思卡尔MC9S12G128MLL

    在这样的上下文中,Bootloader上位机软件的作用是通过CAN总线与MC9S12G128MLL下位机进行通信,实现远程固件更新。用户可能通过上位机软件将新的固件文件发送到下位机,或者执行其他诊断和配置任务。CAN总线是一种...

    Bluetooth test with CMU200.pdf

    基础部分涵盖了远程控制的基本概念,而命令部分则列举了可用于控制测试过程的特定指令,这使得CMU200能够在复杂的测试环境中实现灵活的自动化测试方案。 **错误消息**(Chapter 9: Error Messages) 在测试过程中...

    HPI接口的视频数据传输系统设计

    - **动态加载**:在内核运行时,使用`insmod`/`rmmod`实现模块的加载和删除功能。 在嵌入式系统开发中,通常采用动态加载的方式。针对HPI接口的视频数据传输系统,Linux驱动程序的主要职责包括: - **存储器映射I/...

    linux开发环境用户指南

    使用文本编辑器或者集成开发环境(IDE)编写应用程序代码。 ##### 7.2 运行应用程序 将编译好的应用程序复制到目标设备上运行。 ##### 7.3 使用gdbserver调试应用程序 gdbserver是一种远程调试工具,可以在目标...

    Hi3510 Linux开发环境用户指南

    - **选择发行版**: 选择适合开发的Linux发行版,如Ubuntu、CentOS等。 - **安装操作系统**: 按照官方文档完成操作系统的基本安装。 **1.3.2 安装交叉编译工具** - **下载交叉编译工具**: 可以从官方网站或其他可靠...

    Tornado使用指南

    - 功能:源代码调试工具,支持C/C++和汇编语言。 - 特点:结合图形界面和命令行操作。 - 调试方式:支持断点设置、程序执行控制等基本功能;提供可视化窗口观察应用程序状态;支持复杂调试命令。 - **Browser**...

    EMB9G45 3G移动互联网开发平台用户手册

    - **SourceInsight3的使用方法**:SourceInsight是一款源代码编辑器和项目分析工具。 - **BeyondCompare3的使用方法**:BeyondCompare是一款强大的文件比较工具。 #### 四、Linux嵌入式系统开发 1. **设置交叉...

    mysql安装配置教程-fix-mas开发笔记

    通过运行这个脚本,你可以删除匿名用户,禁止root用户远程登录,删除测试数据库,以及重新加载权限表以应用更改。 在安装和配置完成后,你需要启动MySQL服务并验证其运行状态。在Windows上,可以使用服务管理工具;...

    六轴工业机器人软件调试文档

    - 打开机器人专用软件,并加载本地工程文件夹中的程序。 - 将E盘内的机器人程序导入软件中,并通过鼠标右键选择“连接”选项以建立与控制器的链接。 - 下载程序至机器人控制系统内。 #### 三、紧急停止设置与...

Global site tag (gtag.js) - Google Analytics