11package classloader ;
22
3- import java .io .BufferedInputStream ;
43import java .io .ByteArrayOutputStream ;
54import java .io .FileInputStream ;
65import java .io .IOException ;
6+ import java .lang .reflect .Method ;
77
88/**
99 * Created by 李恒名 on 2017/6/8.
1010 */
1111public class CustomClassLoader extends ClassLoader {
1212 private final String classesDir ;
1313
14+ @ Override
15+ public Class <?> loadClass (String name ) throws ClassNotFoundException {
16+ return super .loadClass (name ,true );
17+ }
18+
1419 public CustomClassLoader (String classesDir ) {
1520 this .classesDir = classesDir ;
1621 }
@@ -24,11 +29,11 @@ protected Class<?> findClass(String name) throws ClassNotFoundException {
2429 fileName = fileName + ".class" ;
2530
2631 try {
27- try (BufferedInputStream bin = new BufferedInputStream ( new FileInputStream (classesDir + fileName ) )) {
32+ try (FileInputStream in = new FileInputStream (classesDir + fileName )) {
2833 try (ByteArrayOutputStream out = new ByteArrayOutputStream ()) {
2934 byte [] buffer = new byte [1024 ];
3035 int len = 0 ;
31- while ((len = bin .read (buffer )) != -1 ) {
36+ while ((len = in .read (buffer )) != -1 ) {
3237 out .write (buffer ,0 ,len );
3338 }
3439 byte [] data = out .toByteArray ();
@@ -41,4 +46,15 @@ protected Class<?> findClass(String name) throws ClassNotFoundException {
4146 }
4247 return super .findClass (name );
4348 }
49+
50+ public static void main (String [] args ) throws ReflectiveOperationException {
51+ //1. 将Test.java 编译为Test.class 后复制到 E:\classes 下,当然也可以选择其他目录作为类加载器的classpath。
52+ //2. 加载
53+ ClassLoader classLoader = new CustomClassLoader ("E:\\ classes\\ " );
54+ Class <?> clazz = classLoader .loadClass ("Test" );//如果你的Test在一个包内,需要加上包名,如x.y.z.Test
55+ //3. 通过反射调用say()方法
56+ Object instance = clazz .newInstance ();
57+ Method method = clazz .getMethod ("say" , null );
58+ method .invoke (instance );//Hello
59+ }
4460}
0 commit comments