永发信息网

Java序列化问题和Groovy在Java中使用的问题

答案:1  悬赏:0  手机版
解决时间 2021-02-23 01:50
  • 提问者网友:精神病院里
  • 2021-02-22 09:11
1.Java序列化问题:
普通Java类序列化简单,但是 我要序列化的不是普通Java类,而是代理类。
源码如下:
Speaking sp = (Speaking) Proxy.newProxyInstance(TestGroovyRun.class
.getClassLoader(), new Class[] { Speaking.class,Serializable.class },
new InvocationHandler() {

public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
System.out.println("Hi,我做了些手脚!!");
MySpeak ms = new MySpeak();
Object o = method.invoke(ms, null);
return o;
}

class MySpeak implements Speaking{

public String speak() {

return "H";
}
}
});

写得怪异了, 总归来说sp只是个代理了MySpeak 的一个对象。 使用Class c[] = sp.getClass().getInterfaces(), 也发现sp实现了Serializable接口。
但是当我序列化它时候就出现java.io.NotSerializableException 异常 ,
待高手解释。

2.Groovy是个动态语言,我使用Spring的


class xxxxx{
//代码省略。。。。。。
}



使用Context当然能够找到id="test" 的对象,但是这个对象是被转换为Java对象,还是属于Groovy对象? 可以序列化,但是反序列化时候就出现异常:ClassNotFoundException。。。。。。
待高手解释:Spring给我的对象是Groovy对象还是已经被转为Java对象了?
最佳答案
  • 五星知识达人网友:一把行者刀
  • 2021-02-22 09:16
proxy对象是不能序列化的,就算能序列化也不能反序列化,因为proxy对象的类是动态生成出来的,序列化后,反序列化时目标jVM肯定没有加载过这个代理类。
有个变通的方法,就是获取到对象本身,序列化;反序列化后获取到原对象,再重新用代理包装即可获得反序列化后的代理对象了。不知道是否贴题。下面有个例子,虽然没有序列化和反序列化,但是基本实现了获取对象本身这个功能,希望能帮到你。

另外groovy对象也是java对象,应该仍然保持groovy对象本身(个人理解,groovy我也是略懂皮毛),spring应该不会对对象本身动刀子,最多加层代理啥的。
//-------------------------------------------------------------------------------
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test implements TestInterface{
public static void main(String[] args) {
final Test t = new Test();
TestInterface t2 = (TestInterface) Proxy.newProxyInstance(
Test.class.getClassLoader(),
Test.class.getInterfaces(),
new InvocationHandler() {

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
return method.invoke(t, args);
} catch(InvocationTargetException ite) {
throw ite.getTargetException();
}
}
}
);
t2.test();
//使用这种方式获取原对象,序列化原对象后,反序列化原对象 重新构造代理
System.out.println(t2.getThis().getClass());
System.out.println(t2.getClass());

}

public void test() {
System.out.println(1);

}
public Test getThis() {
return this;
}
}

interface TestInterface{
public void test() ;
public Test getThis() ;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯