贴段代码来看封装中的问题:class Employee{
...
private Date birthday;
... public Date getBirthday()
{
return birthday;
}
...
}Employee emp = new Employee();
Date d = emp.getBirthday();
d.setYear(2005); //修改了私有域容易犯的错误啊!
...
private Date birthday;
... public Date getBirthday()
{
return birthday;
}
...
}Employee emp = new Employee();
Date d = emp.getBirthday();
d.setYear(2005); //修改了私有域容易犯的错误啊!
import java.lang.reflect.*;
import java.util.*;
public class ObjectAnalyzerTest
{
public static void main(String[] args)
{ Employee harry = new Employee("Harry Hacker", 35000,
1996,12, 1);
System.out.println(harry);
System.out.println(harry);
}
}
class ObjectAnalyzer
{
public static String toString(Object obj)
{
Class cl = obj.getClass();
String r = cl.getName();
do {
r+="[";
Field[] fields=cl.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);
for (int i = 0; i < fields.length; i++)
{
Field f = fields[i];
r += f.getName() +"(";
r+=f.getType().toString()+")=";
try
{
Object val = f.get(obj);
if(val instanceof String)
f.set(obj,"newname");
r += val.toString();
} catch (IllegalAccessException e)
{ r += "???";
}
if (i < fields.length - 1)
r += ",";
}
r+="]";
cl=cl.getSuperclass();
}
while(cl!=Object.class);
return r;
}
}class Employee
{
public Employee(String n, double s, int year, int month,int day)
{ name = n;
salary = s;
GregorianCalendar calander=new GregorianCalendar(year,month-1,day);
hireDay = calander.getTime();
}
public String toString()
{ return ObjectAnalyzer.toString(this);
}
private String name;
private double salary;
private Date hireDay;
}
三楼的朋友用Object.Clone;
却不是强制的手段
毕竟java虚拟机需要通过某些手段去获悉类的内部结构和实现