本文所贴示意代码主要是学习使用。
任务接口:
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();
}
}
}
}
此示意代码主要是从客户端发送实现了特定接口的任务类的字节码发送给服务端执行.
分享到:
相关推荐
自定义类加载器实现自定义加载。自定义类加载器实现自定义加载
类加载器
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...
类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念
java 类加密 使用类加载器解密加载类 反射执行main
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...
java类加载器学习三、类加载器的委托模式
ClassLoader 三种类加载方式 Boostrap Extenxsion 以及Application ClassLoad分别适用的场景
NULL 博文链接:https://smallbee.iteye.com/blog/2111404
ClassLoader,,深入java加载器,,深入java加载器源代码
本案例是一个通过静态代码块获取资源属性文件的代码块,从而来提高应用性能。。
java类加载器学习二、自定义类加载器
主要介绍了Java基于自定义类加载器实现热部署过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本学习讲义是关于java类加载和反射机制需要注意的要点学习,内容详细
(父子关系一般不会以继承的关系实现,而是以组合关系来复用父加载器的代码)工作过程如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请
类加载器从源文件(通常是.class 或 .jar文件)获得不依赖平台的字节码,然后将它们加载到JVM内存空间,所以它们能被解释和执行。默认状态下,应用程序的每个类由java.lang.ClassLoader加载。因为它可以被继承,所以...
虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流"这个动作放到Java虚拟机外部去实现, 以便让应用程序自己决定如何去获取所需要的类. 实现这个动作的代码模块称为"类加载器".
这段代码实现了一个简单的购物车类ShoppingCart,其中使用了Java的类加载和类路径机制。在类的构造方法中,首先通过类加载器将购物车类加载到JVM中,然后创建了一个Map对象来存储购物车中的商品及其数量。接着实现了...
3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4