学习自定义类加载器与运行时包:
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方法,则抛异常:
Exception in thread "main" java.lang.IllegalAccessException: Class test.NewClassLoader can not access a member of class test.MySingletonImp with modifiers ""如果把 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加载)也同样会得到
java.lang.IllegalAccessException: Class A can not access a member of class B with modifiers "" 这样的异常。
但是本人还是不是很理解,我把MySingletonImp 单独提出来时,也不是同一个 runtime package,因为加载器都不一样,NewClassLoader 是系统类加载器加载的,而MySingletonImp 是自定义加载器加载的。。很是不明白,
欢迎大家讨论...
分享到:
相关推荐
请参考 切换到脚本文件夹光盘生成器数据加载器创建名为“ config_ {content_space_id} .ini”的构建器配置文件,并将其保存在“ BuilderConfig”目录中。 从pipfile安装依赖项pipenv安装激活Pipenv外壳皮壳这将产生...
--string=[x]=[y]=[color]=["string“] 字符串位置、颜色与内容,可用于标题,说明,帮助等。单位:列,行,24位色彩。 注:如果省略颜色,位于菜单框以上按标题颜色,位于菜单框以下按帮助文本颜色; 字符串头尾...
F Format ->以用户指定格式输出,Format参数为预定义或自定义设备对象类中的列名,如:name status等 H ->显示列输出前面的头部分,即输出中包括列头部分 P ->列出预定义设备对象类中设备的有关信息,即支持的设备,...
一种按需加载 AngularJS 控制器的方法。 这是一种在需要时加载 AngularJS 控制器的方法。 当控制器被请求时,它将通过 xhr 加载脚本。 版本 0.0.3 都多的 添加测试 添加带有版本控制的离线存储 - 这个想法是在加载...
U-Boot加载Linux内核、Ramdisk或者其它映像时使用一种特殊的映像格式。这种格式包含了一些信息,如创建时间、操作系统、压缩格式、映像类型、映像名和CRC32校验和。 mkimage用来创建这种格式的映像文件或者显示它...
例如, baby-chrome space-shuttle 在此命令上,您将看到一个复选框菜单,用于选择chrome扩展程序的性质,例如,该扩展程序是否需要在后台运行,是否需要jquery等, 选择适当的选项,然后单击Enter。 就是这样,...
HGE 系列教材(1) --- 简介 HGE 是一个硬件加速(Hardware accelerated)的2D 游戏引擎(Game Engine), HGE 是一个富有特性的中间件,可以用于开发任何类型的2D 游戏。...// 加载纹理 quad.tex =...
对实际编程来说,理解您的内存管理器的能力与局限性至关重要。在大部分系统语言中,比如 C 和 C++,您必须进行内存管理。本文将介绍手工的、半手工的以及自动的内存管理实践的基本概念。 追溯到在 Apple II 上...
定位到某一类对象上,这列对象允许的操作都会自动列出来。 特色: 支持Oracle数据库里面所有对象的新建、查看、修改,集成了几乎对所有数据库对象的管理所需要的功能。 按照 模式->对象类别 ->对象->对象可...
§2.5.7 SPACE(列间空格) 84 §2.5.8 Termout (启/停屏幕显示) 84 §2.5.9 ECHO (启/停命令显示) 84 §2.5.10 TRANSACTION (启动事务) 85 §2.5.11 SHOW ALL(列出所有参数) 85 §2.6 格式化输出 87 §2.6.1 一般数据...