클래스 로 더 는 간단 한 원 격 작업 수행 기 표시 코드 (학습 판) 를 실현 합 니 다.

본 논문 에 붙 인 안내 코드 는 주로 학습 사용 이다.
작업 인터페이스:

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();
			}
		}
	}
}

이 안내 코드 는 주로 클 라 이언 트 에서 특정 인 터 페 이 스 를 실현 하 는 작업 클래스 의 바이트 코드 를 서버 에 보 내 서 실행 합 니 다.

좋은 웹페이지 즐겨찾기