tianyunperfect 3 年之前
父节点
当前提交
bde75b47b7
共有 2 个文件被更改,包括 74 次插入0 次删除
  1. 51 0
      test1/src/main/java/MyClassLoader.java
  2. 23 0
      test1/src/main/java/Person.java

+ 51 - 0
test1/src/main/java/MyClassLoader.java

@@ -0,0 +1,51 @@
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.FileChannel;
+import java.nio.channels.WritableByteChannel;
+
+public class MyClassLoader extends ClassLoader {
+    private String classPath;
+
+    public MyClassLoader(String classPath) {
+        this.classPath = classPath;
+    }
+
+    public MyClassLoader(ClassLoader parent) {
+        super(parent);
+    }
+
+    protected Class<?> findClass(String name) throws ClassNotFoundException {
+        File file = new File(classPath + "/" + name + ".class");
+        try {
+            byte[] bytes = getClassBytes(file);
+            Class<?> c = this.defineClass(name, bytes, 0, bytes.length);
+            return c;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return super.findClass(name);
+    }
+
+    private byte[] getClassBytes(File file) throws Exception {
+        // 这里要读入.class的字节,因此要使用字节流
+        FileInputStream fis = new FileInputStream(file);
+        FileChannel fc = fis.getChannel();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        WritableByteChannel wbc = Channels.newChannel(baos);
+        ByteBuffer by = ByteBuffer.allocate(1024);
+        while (true) {
+            int i = fc.read(by);
+            if (i == 0 || i == -1)
+                break;
+            by.flip();
+            wbc.write(by);
+            by.clear();
+        }
+        fis.close();
+        return baos.toByteArray();
+    }
+}

+ 23 - 0
test1/src/main/java/Person.java

@@ -0,0 +1,23 @@
+public class Person {
+    private String name;
+
+    public Person() {
+
+    }
+
+    public Person(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String toString() {
+        return "I am a person, my name is " + name;
+    }
+}