您的位置:首页 > 其它

类加载器[4]由不同ClassLoader对象加载的同名类属于不同类

2017-03-06 15:49 239 查看
 
由不同ClassLoader对象加载的同名类属于不同的类型,不能相互转化和兼容。
新建一个工程NotSameClass。将如下代码,一份放入NoSameClass工程源代码目录下,一份编译成.class放入D:\temp目录下



运行如下代码,使用不同的类加载器加载同一个类(源代码都一样,不过一个来自bin目下的.class,一个来自D:\temp下的.class)
 Java Code 
 package com.bjsxt.test;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {

    public static void main(String[] args) {

        

        //先用应用类加载器加载HelloLoader
        HelloLoader object1=new HelloLoader();

        System.out.println(object1.getClass().getClassLoader());

        

        //再用扩展类加载器加载HelloLoader
        ClassLoader cl = ClassLoader.getSystemClassLoader();

        try {

            byte[] classBytes = loadClassBytes("com.bjsxt.test.HelloLoader");

            

            Method defineClassMethod = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);

            defineClassMethod.setAccessible(true);

            defineClassMethod.invoke(cl.getParent(), classBytes, 0, classBytes.length);

            

            Class<?> clazz = cl.getParent().loadClass("com.bjsxt.test.HelloLoader");

            System.out.println(clazz.getClassLoader());

            

            //两个不同类的对象强制类型转换
            object1=(HelloLoader)clazz.newInstance();

            

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }catch (SecurityException e) {

            e.printStackTrace();

        } catch (IllegalAccessException e) {

            e.printStackTrace();

        } catch (IllegalArgumentException e) {

            e.printStackTrace();

        } catch (InstantiationException e) {

            e.printStackTrace();

        } catch (NoSuchMethodException e) {

            e.printStackTrace();

        } catch (InvocationTargetException e) {

            e.printStackTrace();

        }

        

    }

    

    /**

     * 将包名中的.替换成路径分隔符,从D:/temp/目录下查找这个文件,如果存在的话,将其读取到字节数组

     * @param name

     * @return

     */

    public static byte[] loadClassBytes(java.lang.String name) {

        

        String path="D:/temp/"+name.replace(".", "/")+".class";

        

        InputStream is=null;

        ByteArrayOutputStream baos=null;

        

        try {

            is=new FileInputStream(path);

            

            baos=new ByteArrayOutputStream();

            

            byte[] buffer=new byte[1024];

            

            int ret=0;

            while((ret=is.read(buffer))!=-1){

                baos.write(buffer, 0, ret);

            }

            

            return baos.toByteArray();

            

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }finally{

            try {

                if(is!=null)

                    is.close();

                

                if(baos!=null)

                    baos.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

        

        return null;

    }

}
 



 
并且,即便是同一类 类加载器,不同的对象加载出来的类也不是同一个类。



 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: