Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定的类:BootStrap、ExtClassLoader、AppClassLoader。
3、测试自己的类加载器
类加载器也是Java类,显然其他事java类的类加载器本身也要被累加器加载,显然必须有第一个类加载器不是java类,这正是BootStrap。
关系图:
例子:
1、要加载的类的代码
- public class ClassLoaderAttachment extends Date{
- public String toString(){
- return "hello,itcast";
- }
- }
2、自己定义的类加载器
- public class MyClassLoadTest extends ClassLoader {
- public static void main(String[] args)throws Exception{
- String srcPath = "D:\\Users\\MyEclipse 10\\JavaEnhance\\bin\\com\\ysh\\day2\\ClassLoaderAttachment.class";
- System.out.println("11111111111111111111");
- String destDir = "itcastlib";
- FileInputStream fis = new FileInputStream(srcPath);
- String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);
- String destPath = destDir + "\\" + destFileName;
- FileOutputStream fos = new FileOutputStream(destPath);
- cypher(fis,fos);
- fis.close();
- fos.close();
- //System.out.println(new ClassLoaderAttachment().toString());
- }
- //对.class文件加密,确保只能有自己的类加载器才能用
- private static void cypher(InputStream ips,OutputStream ops)throws Exception{
- int b = -1;
- while((b=ips.read())!=-1){
- ops.write(b ^ 0xff);
- }
- }
- private String classDir;
- @Override//重写findClass方法,因为加载.class文件前要先解密。
- protected Class<?> findClass(String name) throws ClassNotFoundException{
- System.out.println("12333");
- String classFileName = classDir + "\\" + name.substring(name.lastIndexOf('.')+1) + ".class";
- try{
- FileInputStream fis = new FileInputStream(classFileName);
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- cypher(fis,bos);
- byte[] bytes = bos.toByteArray();
- return defineClass(bytes,0,bytes.length);
- }catch(Exception e){
- e.printStackTrace();
- }
- return super.findClass(name);
- }
- //空的构造方法
- public MyClassLoadTest(){<span style="white-space:pre"> </span>
- }
- //重载的构造方法
- public MyClassLoadTest(String classDir){
- this.classDir = classDir;
- }
- }
- public class ClassLoadTest{
- public static void main(String[] args) throws Exception{
- Class clazz = new MyClassLoadTest("itcastlib").loadClass("com.ysh.day2.ClassLoaderAttachment");
- Date d = (Date)clazz.newInstance();
- System.out.println(d);
- }
- }