package com.zqh.classloader; import java.io.*; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; /** * Created by zqhxuyuan on 15-2-28. */ public class CassLoader_findClass extends ClassLoader { private final File baseDir; public CassLoader_findClass(File baseDir) throws IOException { this.baseDir = baseDir; } @Override protected Class findClass(String name) throws ClassNotFoundException { //类名 -> 类名.class String path = name.replaceAll("\\.", File.separator) + ".class"; File file = new File(baseDir, path); FileInputStream inputStream = null; try { inputStream = new FileInputStream(file); MappedByteBuffer bb = inputStream.getChannel(). map(FileChannel.MapMode.READ_ONLY, 0, file.length()); // Converts a ByteBuffer into an instance of class Class Class<?> klass = defineClass(null, bb, null); return klass; } catch (IOException e) { throw new RuntimeException("Failed to load class", e); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String args[]) throws IOException, ClassNotFoundException { args = new String[]{ "/home/hadoop/IdeaProjects/go-bigdata/helloworld/target/classes/com/zqh/interview", "MyClassLoader"}; //class name: com.zqh.interview.MyClassLoader args = new String[]{ "/home/hadoop/IdeaProjects/go-bigdata/helloworld/target/classes/com/zqh/util", "Common"}; //class name: com.zqh.util.Common if (args.length < 2) { System.err.println("usage: java " + CassLoader_findClass.class.getSimpleName() + " <baseDir> <className>"); } //第一个参数是编译后的文件位置, 而不是源文件路径 String baseDir = args[0]; String className = args[1]; CassLoader_findClass cl = new CassLoader_findClass(new File(baseDir)); Class<?> aClass = cl.loadClass(className); System.out.println("class name: " + aClass.getName()); } }