[color=red]学习自定义类加载器与运行时包:[/color]
以上两个类是放在同一个文件下面
接口MySingleton 单独放在一个文件下面,此时执行mian方法,则抛异常:
[color=red]Exception in thread "main" java.lang.IllegalAccessException: Class test.NewClassLoader can not access a member of class test.MySingletonImp with modifiers ""[/color]如果把 MySingletonImp 类提出来单独放一个文件
则执行不会抛异常,输出 false
baidu描述原因:
Java语言中的包访问成员(friendly)实际上指的是运行时包访问可见,而不是编译时。因此当你试图访问不在同一个runtime package的成员是(即便在编译时它们在同一个包内,但是却由不同的class loader加载)也同样会得到[color=red]java.lang.IllegalAccessException: Class A can not access a member of class B with modifiers "" [/color]这样的异常。
但是本人还是不是很理解,我把MySingletonImp 单独提出来时,也不是同一个 runtime package,因为加载器都不一样,NewClassLoader 是系统类加载器加载的,而MySingletonImp 是自定义加载器加载的。。很是不明白,
欢迎大家讨论...
package test;
import java.io.InputStream;
public class NewClassLoader extends ClassLoader {
public MySingleton createNewOne() throws Exception {
InputStream is = getClass().getResourceAsStream("MySingletonImp.class");
byte[] b = new byte[is.available()];
is.read(b);
Class clz = defineClass(null, b, 0, b.length);
Object o = clz.newInstance();
return (MySingleton) o;
}
public static void main(String[] args) throws Exception {
NewClassLoader loader = new NewClassLoader();
MySingleton newObj = loader.createNewOne();
MySingletonImp instance = MySingletonImp.getInstance();
System.out.println(MySingletonImp.class.getClassLoader());
System.out.println(instance == newObj);
}
}
class MySingletonImp implements MySingleton {
private static final MySingletonImp instance = new MySingletonImp();
public static MySingletonImp getInstance() {
return instance;
}
}
以上两个类是放在同一个文件下面
package test;
public interface MySingleton {
}
接口MySingleton 单独放在一个文件下面,此时执行mian方法,则抛异常:
[color=red]Exception in thread "main" java.lang.IllegalAccessException: Class test.NewClassLoader can not access a member of class test.MySingletonImp with modifiers ""[/color]如果把 MySingletonImp 类提出来单独放一个文件
package test;
public class MySingletonImp implements MySingleton {
private static final MySingletonImp instance = new MySingletonImp();
public static MySingletonImp getInstance() {
return instance;
}
}
则执行不会抛异常,输出 false
baidu描述原因:
Java语言中的包访问成员(friendly)实际上指的是运行时包访问可见,而不是编译时。因此当你试图访问不在同一个runtime package的成员是(即便在编译时它们在同一个包内,但是却由不同的class loader加载)也同样会得到[color=red]java.lang.IllegalAccessException: Class A can not access a member of class B with modifiers "" [/color]这样的异常。
但是本人还是不是很理解,我把MySingletonImp 单独提出来时,也不是同一个 runtime package,因为加载器都不一样,NewClassLoader 是系统类加载器加载的,而MySingletonImp 是自定义加载器加载的。。很是不明白,
欢迎大家讨论...