原则:访问位于其他包中的非公共类型的成员是不合法的,即便该成员被声明为某公共类型的公共成员。
案列1:
package coner_case;
import java.util.*;
import java.lang.reflect.*;
public class Reflector {
public static void main(String[] args) throws Exception{
Set<String> s = new HashSet<String>();
s.add("foo");
Iterator<String> it = s.iterator();
//Method m = it.getClass().getMethod("hasNext");
//这种惯用技法,有问题,不推荐使用
//it.getClass()得到是私有的嵌套类KeyIterator
//替换注释部分,使用注释部分,运行会报该类型不是公共类型
Method m = Iterator.class.getMethod("hasNext");
System.out.println(m.invoke(it));
}
}
案列2:
package library;
public class Api{
static class PackagePrivate{}
public static PackagePrivate member = new PackagePrivate();
}
package client;
import library.Api;
class Client{
public static void main(String[] args) {
//注释部分无法编译噢 调用的类型是位于其他包中的非公共类型
//System.out.println(Api.member.hashCode());
System.out.println(((Object)Api.member).hashCode());
}
}