public static <T> T classLoader(String className) throws Exception {
ClassLoader myClassLoader = new ClassLoader() {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
//获取类文件名
String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
InputStream inputStream = getClass().getResourceAsStream(fileName);
if (inputStream == null) {
return super.findClass(fileName);
}
byte[] bytes = new byte[inputStream.available()];
inputStream.close();
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
throw new ClassNotFoundException();
}
}
};
return (T) myClassLoader.loadClass(className).newInstance();
}
public static void main(String[] args) throws Exception {
//测试1
Object obj2 = classLoader("com.myweb.reflect.classloader.ClassLoaderTest");
System.out.println(obj2.getClass());
System.out.println(obj2 instanceof com.myweb.reflect.classloader.ClassLoaderTest);
//测试2
ClassLoader myClassLoader = new ClassLoader() {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
//获取类文件名
String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
InputStream inputStream = getClass().getResourceAsStream(fileName);
if (inputStream == null) {
return super.findClass(fileName);
}
byte[] bytes = new byte[inputStream.available()];
inputStream.close();
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
throw new ClassNotFoundException();
}
}
};
Object obj3 = myClassLoader.loadClass("com.myweb.reflect.classloader.ClassLoaderTest");
System.out.println(obj3.getClass());
System.out.println(obj3 instanceof com.myweb.reflect.classloader.ClassLoaderTest);
}
输出:
class com.myweb.reflect.classloader.ClassLoaderTest
true
class java.lang.Class
false
为什么两段相同的代码,只是一个单独提取出来,输出就不一样了呢?
これらは 2 つの同一のコードであると確信していますか?
最初のコードスニペットにはもう 1 つの文があります
return (T) myClassLoader.loadClass(className).newInstance();