- package Study.ClassLoader;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- public class Test2 {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- MineClassLoader loader = new MineClassLoader("myClassLoader"); //创建一个类加载器并自定义一个名称
- try {
- Class<?> clazz = loader.loadClass("Animal.class"); //类加载器的作用:通过类名,将硬盘中的字节码文件加载进内存并创建字节码对象
- try {
- Object obj = clazz.newInstance(); //所以类加载器最终要创建对象
- Animal animal = (Animal)obj;
- animal.println(); //看打印结果
-
- //System.out.println(Animal.getClass().getClassLoader().getClass().getName());
-
- } catch (InstantiationException | IllegalAccessException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- class Animal{
- void println(){
- System.out.println("一个自定义类");
- }
- }
- class MineClassLoader extends ClassLoader{
- private String name; //定义成员,类加载器的名称
-
- private String class_path = "E:\\黑马训练营\\ITHEIMA\\高新技术\\bin\\Study\\ClassLoader\\"; //把要加载的类的绝对路径存储起来
- //E:\黑马训练营\ITHEIMA\高新技术\bin\Study\ClassLoader\Animal.class
- MineClassLoader(String name){ //给自定义类加载器定义一个构造器
- this.name = name;
- }
- MineClassLoader(ClassLoader loader, String name){
- super(loader); //调用父类的构造器:使用指定的类加载器来创建新的类加载器
- this.name = name;
- }
- //注意,覆盖父类的方法可以通过IDE自动生成,通过类名来获取该类的字节码对象,这个findClass方法被loadClass方法隐式调用
- @Override //这个方法充分的体现了类加载器的作用
- protected Class<?> findClass(String name) throws ClassNotFoundException { //不能抛出比父类级别高的异常
- // TODO Auto-generated method stub
- String path = this.class_path + name; //要加载的字节码文件的绝对路径
- System.out.println(path); //打印测试一下
- try {
- FileInputStream fi = new FileInputStream(new File(path)); //把要加载的字节码文件关联字节读取流
- ByteArrayOutputStream ba = new ByteArrayOutputStream(); //创建一个内存输出流
- int num = 0 ;
- //读取这份字节码文件
- while((num = fi.read()) != -1){
- ba.write(num); //写入内存流
- ba.flush();
- }
- fi.close(); //关闭读取流
- byte[] buf = ba.toByteArray(); //将内存流中的字节转换成字节数组
- ba.close(); //关闭内存流
- //返回一份字节码
- return this.defineClass(this.name, buf, 0, buf.length);
-
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //使用原类加载器加载
- return super.findClass(path);
- }
- }
复制代码 E:\黑马训练营\ITHEIMA\高新技术\bin\Study\ClassLoader\Animal.class
Exception in thread "main" java.lang.NoClassDefFoundError: myClassLoader (wrong name: Study/ClassLoader/Animal)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at Study.ClassLoader.MineClassLoader.findClass(Test2.java:74)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at Study.ClassLoader.Test2.main(Test2.java:18)
总是报告我. NoClassDefFoundError: myClassLoader (wrong name: Study/ClassLoader/Animal)异常,求解释
|