在JAVA中,如果一个类,方法,属性被设置成protected,表明只能在子类或者同一个命名空间中才能使用,但我们可以巧妙的利用特殊的编码方式,在其他的命名空间下,创造同一个命名空间,从而访问 protected 代表的类,方法,属性。
举例,定义一个Person类,注意:address 是protected static
package test;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
public class Person {
{
System.out.println("instance 1");
System.out.println(toString());
}
static {
System.out.println("static 1");
}
private String privateName = "privateName";
protected String protectedName = "protectedName";
String friendlyName = "friendlyName";
public String publicName = "publicName";
private static String privateStaticName = "privateStaticName";
protected static String protectedStaticName = "protectedStaticName";
static String friendlyStaticName = "friendlyStaticName";
public static String publicStaticName = "publicStaticName";
public Person() {
System.out.println("no name");
}
public Person(String name) {
System.out.println("my name is " + name);
System.out.println(toString());
this.privateName = name;
System.out.println(toString());
}
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("privateName", privateName)
.append("protectedName",protectedName)
.append("friendlyName",friendlyName)
.append("publicName",publicName)
.append("privateStaticName",privateStaticName)
.append("protectedStaticName",protectedStaticName)
.append("friendlyStaticName",friendlyStaticName)
.append("publicStaticName",publicStaticName).toString();
}
{
System.out.println("instance 2");
System.out.println(toString());
}
static {
System.out.println("static 2");
}
}
利用new Person()制造命名空间:
package test;
public class PersonTest {
public static void main(String[] args) {
Person person = new Person("bob") {
{
System.out.println("outside");
}
public void cut() {
System.out.println("cut");
}
{
publicName = "newPublicName";
protectedName = "newProtectedName";
friendlyName = "newFriendlyName";
publicStaticName = "newPublicStaticName";
protectedStaticName = "newProtectedStaticName";
friendlyStaticName = "newFriendlyStaticName";
cut();
System.out.println(toString());
}
};
System.out.println(person.toString());
}
}