2

是否可以将加载的类保存到文件中?

Class cc = Class.forName("projects.implementation.JBean");

或者,也许是为了获得该班级的实际位置?

4

2 回答 2

1

是的,您可以作为 Class.class 实现Serializable接口,您可以将其序列化到文件中并再次反序列化。

例子 -

Class Test{
    public static void main(String[] args) throws ClassNotFoundException {
        try {
            OutputStream file = new FileOutputStream("test.ser");
            OutputStream buffer = new BufferedOutputStream(file);
            ObjectOutput output = new ObjectOutputStream(buffer);
            try {
                Class cc = Class.forName("com.test.Test");
                System.out.println(cc);
                output.writeObject(cc);
            } finally {
                output.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        try {
            // use buffering
            InputStream file = new FileInputStream("test.ser");
            InputStream buffer = new BufferedInputStream(file);
            ObjectInput input = new ObjectInputStream(buffer);
            try {
                // deserialize the class
                Class cc = (Class) input
                        .readObject();
                // display 
                System.out.println("Recovered Class: " + cc);
            } finally {
                input.close();
            }
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

    }
    }
于 2012-11-18T09:49:35.067 回答
0

在 Java 中序列化一个 Class 对象只是序列化类的限定名称。反序列化时,按名称查找类。

在一般情况下,我认为一旦加载了与类定义(字节码)相对应的字节,就不可能得到它。Java 允许在运行时定义类,并且据我所知,在加载类后不会公开字节。

但是,根据使用的 ClassLoader,您可能会发现

cc.getResourceAsStream("JBean.class")

就是你所需要的,使用它自己的 ClassLoader 将类流作为资源加载。

另一种选择可能是拦截类的加载。ClassLoader 将看到“defineClass”中的字节,因此自定义 ClassLoader 可以将它们存储在某个地方。

于 2012-11-18T14:12:52.353 回答