【问题标题】:How to cast an object in class loaded in classloader如何在类加载器中加载的类中转换对象
【发布时间】:2014-08-06 10:52:05
【问题描述】:

我是 Stack Overflow 的新手。我创建了一个 Groovy 类加载器对象,在其中加载了脚本所需的所有类。我的任务是序列化和反序列化由类加载器中加载的类之一创建的对象。问题是在反序列化时我无法将类中的对象转换为类加载器中加载的类。我不知道如何在类加载器中加载的类中转换对象。有人可以帮助我吗?这 ?????下面的 sn-p 是一个在类加载器中加载的类,但是我该如何实现呢。

Object o = null
new ByteArrayInputStream(bytes).withObjectInputStream(getClass().classLoader){ gin ->
                                o = (?????)gin.readObject() }

提前致谢!!!

【问题讨论】:

  • 您的代码现在看起来如何?我的回答有帮助吗?
  • 是的,你的回答很有用。

标签: groovy casting groovyclassloader


【解决方案1】:

我设法解决了您的问题。让我向您展示一个工作示例

我使用的一些 Employee

public class Employee implements java.io.Serializable
{
    public String name;
    public String address;
}

然后是Main

class Main {

    public static void main(String[] args) {
        Employee e1 = new Employee()
        e1.name = 'John'
        e1.address = 'Main Street'

        byte[] bytes = []

        ByteArrayOutputStream stream = new ByteArrayOutputStream()
        ObjectOutputStream out = new ObjectOutputStream(stream)
        out.writeObject(e1)
        bytes = stream.toByteArray()
        out.close()
        stream.close()

        Object o = null
        new ByteArrayInputStream(bytes).withObjectInputStream(Main.getClassLoader()){ gin ->
            o = gin.readObject()
        }

        print o instanceof Employee
        println 'Deserialized Employee...'
        println 'Name: ' + o.name
        println 'Address: ' + o.address
    }
}

我不是在做getClass().classLoader,而是在抛出java.lang.ClassNotFoundException,而是在做Main.getClassLoader()。这个类加载器能够找到我的Employee 类。

此外,您实际上并不需要强制转换对象,它很时髦,它是动态的,因此您在运行时会获得 nameaddress 字段。

但是,您始终可以检查对象的类型,然后进行转换:

print o instanceof Employee

这将返回true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多