黑马程序员技术交流社区

标题: java编码问题、 [打印本页]

作者: 陈欢    时间: 2012-7-17 21:04
标题: java编码问题、
本帖最后由 陈欢 于 2012-7-20 00:41 编辑

在JAVA解序列化中,如何读取bk1的private变量,不太明白
public static void main(String[] args) throws IOException, ClassNotFoundException {
try{
Book bk=new Book(0010,"JAVA学习基础","张宇",45.80);
FileOutputStream fo=new FileOutputStream("book.dat");
ObjectOutputStream oo=new ObjectOutputStream(fo);
oo.writeObject(bk);
oo.close();
FileInputStream fi=new FileInputStream("book.dat");
ObjectInputStream oi=new ObjectInputStream(fi);
Book bk1=(Book)oi.readObject();
}
}
catch(IOException e){
System.out.println("I/O Exception");
}
} }
class Book implements Serializable {
private int m_id;
private String m_name;
private String m_author;
double m_price;
public Book(int id, String name, String author, double price) {
m_id = id;
m_name = name;
m_author = author;
m_price = price;
}
}
作者: 梁小波    时间: 2012-7-17 22:06
重发一次
建议:把代码弄到代码块上!

你的意思是怎么在main中读取bk1中的private变量吧;
很抱歉不可以!其实非要那么做就用暴力反射,我想那也不是你的意愿!
为什么不可以呢?序列号可以说是为了让对象长久存储!多用在游戏编程,流行的云计算等技术基础!
序列化不会破坏java的规则!所以以前在main中不可以访问private变量;现在也不可以!
那么Book bk1=(Book)oi.readObject();就好比book bk1=new book();
利用bk1能做的和以前一样!
序列化的目的是是为了本地化存储对象,可能现在demo中不是太能体现价值。
作者: 陈少文    时间: 2012-7-18 11:37
/*
你的意思是说要读取私有变量是不是?

private 变量只在本类中有效,其它类就无法
直接读取,如果要读取,可以定义一个public
函数,把private变量传进去。其它类访问public
函数就可以了。

还有一个方法是反射。
我举了两个例子一看就明白了。
*/

class Book
{
        //m_name只在本类中有效
        private String m_name = "张三";

        //定义一个public 方法
        public String getM_name() {
                return m_name;
        }

        public void setM_name(String m_name) {
                this.m_name = m_name;
        }

}

public class PrivateDemo
{
        public static void main(String[] args)        throws Exception
        {
                Book b1 = new Book();
                //调用public 方法,访问private 变量
                String m_name1 = b1.getM_name();
                System.out.println(m_name1);
               
               
                //还有一种方法,反射
                //Field得到类的成员变量
                Field fieldN = b1.getClass().getDeclaredField("m_name");
                //强制得到类的私有变量
                fieldN.setAccessible(true);
                System.out.println(fieldN.get(b1));
        }
}

打印出






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2