//使用MyClassLoader加载器加载一个类,itcastlib(目录)是main方法的参数,这个加载器默认是挂到系统加载器下面,作为系统加载器的孩子
//父类只能加载这个cn.itcast.day2.ClassLoaderAttachment(带包名)
Class clazz = new MyClassLoader("itcastlib").loadClass("cn.itcast.day2.ClassLoaderAttachment");
//使用字节码创建对象,,
//如果d1是ClassLoaderAttachment类型的话编译报错,,因为程序里面出现了ClassLoaderAttachment类名,
//编译器检查这个类名时他就会使用加载器去加载他,但是那个类是加密后的类,编译器加载加载时加载了个乱码的文件,编译器就报错,,
//就是写ClassLoaderAttachment的话编译器都过不了,
//编译报错(运行ClassLoaderTest时加载ClassLoaderAttachment就报错,编译器说那个ClassLoaderAttachment类编译不了)
//编译器编译时要加载那个ClassLoaderAttachment类
//,所以得使用ClassLoaderAttachment的父类Date
Date d1 = (Date)clazz.newInstance();
//ClassLoaderAttachment 是加密后
// ClassLoaderAttachment d1=(ClassLoaderAttachment)clazz.newInstance();
System.out.println(d1);
问题1:如果我写ClassLoaderAttachment d1=(ClassLoaderAttachment)clazz.newInstance();,那为什么会在运行时才会报错,,而不是编译时就报错,
我的理解:当你在程序里写ClassLoaderAttachment 时,虚拟机就把这个类加载到内存里了,他一加载加密后的类就肯定报错,为什么在编译时就不报错,而是运行时才报错,
问题2:我看视频发现老师第一次("cn.itcast.day2.ClassLoaderAttachment" )是没有写包名的,没加包名也没问题,,,后面老师才加了包名,我在实际写代码时一开始我就指定了包名,,
为什么老师开始时就不加包名呢
|