【不合法的访问】小心其他包中的非公共类型

原则:访问位于其他包中的非公共类型的成员是不合法的,即便该成员被声明为某公共类型的公共成员。

 

案列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());
	}
}


 

你可能感兴趣的:(类型)