日期:2014-05-20  浏览次数:20748 次

求解。。IO系统不解之3
今天看到了序列化(serialize) 来了问题。。。
那个Serializable接口有一种方法可以也让我们自定义序列化,就是在类中实现writeObject方法和readObject方法,而且书上说还设成了private,那ObjectInputStream和ObjectOutputStream是如何调用他的呢 ?明明是private,也不可以调用类中的其他方法来调用 ,书上也说到这问题了 可是他说了半天也没说明白。。。估计是翻译的不好。。。。希望老鸟帮帮忙

------解决方案--------------------
通过反射调用private方法及属性
------解决方案--------------------
探讨

通过反射调用private方法及属性

------解决方案--------------------
是呀,不知道反射调用,怎么用的
不过读写只用ObjectInputStream就可以了。。。
------解决方案--------------------
一个反射的例子

Java code
import java.lang.relfect.*;
class A {
    private void test() {
        System.out.println("this is a private method");
    }
}

public class Test {
    public static void main(String[] args) throws Throwable {
        A a = new A();
        Class c = A.class;
        Method m = c.getDeclaredMethod("test", new Class[]{}); //获取方法
        m.setAccessible(true); //修改访问权限
        m.invoke(a, new Object[]{}); //调用方法
    }
}

------解决方案--------------------
本地方法调用
------解决方案--------------------
“对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。”

m.invoke(a,new Object[]{}),表示唤醒 a 对应的类实例中 的 m 方法, 其参数为 Object[]{}

楼主要深究反射的话, 建议多看看java类加载机制,jvm运行的一些原理等等,应该很有帮助。