클래스 로 더 는 간단 한 원 격 작업 수행 기 표시 코드 (학습 판) 를 실현 합 니 다.
작업 인터페이스:
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();
}
}
}
}
이 안내 코드 는 주로 클 라 이언 트 에서 특정 인 터 페 이 스 를 실현 하 는 작업 클래스 의 바이트 코드 를 서버 에 보 내 서 실행 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.