学习自定义类加载器与运行时包:
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 是自定义加载器加载的。。很是不明白,
欢迎大家讨论...
分享到:
相关推荐
### 链接器与加载器相关知识点 #### 一、链接器与加载器的作用及概念 **链接器(Linker)**是一种将多个已编译的程序模块(如目标文件)组合成一个可执行程序的工具。它负责解决各模块间的符号引用,并进行地址空间...
方法区也被称为永久代(PermGen space),主要用来存储已被虚拟机加载的类信息、常量、静态变量以及即时编译器编译后的代码等数据。值得注意的是,不同虚拟机实现对方法区的具体布局可能有所不同,这些差异取决于...
--string=[x]=[y]=[color]=["string“] 字符串位置、颜色与内容,可用于标题,说明,帮助等。单位:列,行,24位色彩。 注:如果省略颜色,位于菜单框以上按标题颜色,位于菜单框以下按帮助文本颜色; 字符串头尾...
请参考 切换到脚本文件夹光盘生成器数据加载器创建名为“ config_ {content_space_id} .ini”的构建器配置文件,并将其保存在“ BuilderConfig”目录中。 从pipfile安装依赖项pipenv安装激活Pipenv外壳皮壳这将产生...
加载方式有隐式加载(如new关键字创建对象时)和显式加载(如通过class.forName())。JVM按需加载,仅加载必要的类,提高了速度并减少了内存占用。加载过程包括装载、链接(包含检查、准备和解析)、初始化等步骤。 ...
5. **初始化**:这是类加载的最后一步,在之前的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码...
类加载器按需加载类,分为隐式加载(如`new`操作)和显式加载(如`Class.forName()`)。这种按需加载策略优化了加载速度和内存使用。 Java内存分配主要涉及以下几个区域: - **寄存器**:由硬件提供,不可直接控制...
- **描述**: 最基础的类加载器,负责加载 JVM 自身需要的类库。 **7.23 Extension ClassLoader** - **作用**: 负责加载 Java 扩展类库。 **7.24 System ClassLoader** - **定义**: 负责加载应用程序类路径中的类。...
Q2支持动态加载类文件,提高了系统的灵活性和扩展性。 ### 总结 本文详细介绍了jPOS项目的主要特性及其在ISO-8583标准下的应用。通过深入理解这些知识点,开发者可以更加高效地利用jPOS来构建可靠的支付系统和交易...
Java类加载器是动态的,它根据需要加载类。加载方式分为隐式和显式:隐式加载发生在创建对象时,如`new`操作;显式加载则是通过`Class.forName()`等方法手动调用。每个类或接口都有对应的.class文件,它们作为独立的...
- 去除空白字符: `TRIM(LEADING|TRAILING|BOTH 'space' FROM column_name)`. - 日期转换: `TO_DATE(value, format)`. - 字符串转日期: `TO_CHAR(date_column, format)`. - 数值转换: `TO_NUMBER(value)`. - ...
类加载器负责从硬盘读取.class文件到内存中,确保Java程序的动态加载。类的加载方式分为隐式加载(如通过new创建对象时)和显式加载(如调用class.forName())。 Java内存分配主要涉及以下区域: - 寄存器:程序员...
F Format ->以用户指定格式输出,Format参数为预定义或自定义设备对象类中的列名,如:name status等 H ->显示列输出前面的头部分,即输出中包括列头部分 P ->列出预定义设备对象类中设备的有关信息,即支持的设备,...
2. **JVM加载Class文件的原理**:类加载器(ClassLoader)负责加载类文件到JVM中,分为隐式加载(如new操作)和显式加载(如class.forName())。加载过程遵循“按需加载”原则,仅在需要时加载类,以提高性能并减少...
- 正确答案: A (<%@Register TagPrefix="Mike" TagName="Space2" Src="myX.ascx"%>) - 解析: 在ASP.NET中,用户控件(ascx文件)需要在使用它的ASPX页面中进行注册。注册指令中,`TagPrefix` 指定了前缀,`TagName` ...
- 用户控件注册:使用`<%Register>`指令,如`<%Register TagPrefix = "Space2" TagName = "Mike" Src = "myX.ascx"%>`。 - 数据库连接创建:如`SqlConnection con1 = new SqlConnection("连接字符串")`。 6. **...
##### §3.5 类变量与类方法 - **类变量**:以`@@`开头的变量可以在类的所有实例之间共享。 - **类方法**:使用关键字`self`定义的方法,只能由类调用而不是对象。 ##### §3.6 存取控制 - **访问级别**:Ruby支持...