- 浏览: 932085 次
- 性别:
- 来自: 魔都
文章分类
- 全部博客 (745)
- MultiThread (19)
- My Plan (118)
- JavaBasic (61)
- MyInterview (104)
- InternetTechnique (5)
- ProjectConclusion (1)
- Maven (5)
- MogoDb (5)
- Hadoop (11)
- Memcached (6)
- TechniqueCollect (1)
- Ibaits (1)
- Android (34)
- ItLife (40)
- Tree (2)
- ProjectArchitect (7)
- Open Source (3)
- liunx (5)
- socket (8)
- Spring (27)
- DesginPattern (35)
- WebBasic (13)
- English (13)
- structs (1)
- structs2 (2)
- Oracle (17)
- Hibernate (2)
- JavaScript (4)
- Jdbc (1)
- Jvm (15)
- Ibatis (1)
- DataStructures (13)
- Https/Socket/Tcp/Ip (3)
- Linux (4)
- Webservice (7)
- Io (2)
- Svn (1)
- Css (1)
- Ajax (1)
- ExtJs (1)
- UML (2)
- DataBase (6)
- BankTechnique (3)
- SpringMvc (3)
- Nio (3)
- Load Balancing/Cluster (3)
- Tools (1)
- javaPerformanceOptimization (8)
- Lucene(SEO) (1)
- My Think (80)
- NodeJs (1)
- Quartz (1)
- Distributed-java (1)
- MySql (7)
- Project (4)
- junit (4)
- framework (1)
- enCache (1)
- git (2)
- SCJP (1)
- sd (1)
最新评论
-
lkjxshi:
你都这水平了还考这个证干嘛
SCJP 认证考试指南 -
钟逸华:
问的真多
百度java开发面试题(转) -
zuimeitulip:
觉得我就是这样的,从小阅读量就很少,导致现在的读的速度非常慢, ...
让读书成为一种习惯 -
DDT_123456:
我觉得你是不符合要求。问你hashmap的那个问题,你那样回答 ...
阿里面试2(转) -
jingjing0907:
刚刚写了很多读过此博客的感受,竟然没有发上去,以为我注册账号还 ...
让读书成为一种习惯
1、用户自定义的类加载器:
要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名字,返回对应的Class对象的引用。
findClass
protected Class<?> findClass(String name)
throws ClassNotFoundException
使用指定的二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被 loadClass 方法调用。默认实现抛出一个 ClassNotFoundException。
参数:
name - 类的二进制名称
返回:
得到的 Class 对象
抛出:
ClassNotFoundException - 如果无法找到类
从以下版本开始:
1.2
创建用户自定义的类加载器:
public class MyClassLoader extends ClassLoader {
//类加载器名称
private String name;
//加载类的路径
private String path = "D:/";
private final String fileType = ".class";
public MyClassLoader(String name){
//让系统类加载器成为该 类加载器的父加载器
super();
this.name = name;
}
public MyClassLoader(ClassLoader parent, String name){
//显示指定该类加载器的父加载器
super(parent);
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@Override
public String toString() {
return this.name;
}
/**
* 获取.class文件的字节数组
* @param name
* @return
*/
private byte[] loaderClassData(String name){
InputStream is = null;
byte[] data = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
this.name = this.name.replace(".", "/");
try {
is = new FileInputStream(new File(path + name + fileType));
int c = 0;
while(-1 != (c = is.read())){
baos.write(c);
}
data = baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
is.close();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return data;
}
/**
* 获取Class对象
*/
@Override
public Class<?> findClass(String name){
byte[] data = loaderClassData(name);
return this.defineClass(name, data, 0, data.length);
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//loader1的父加载器为系统类加载器
MyClassLoader loader1 = new MyClassLoader("loader1");
loader1.setPath("D:/lib1/");
//loader2的父加载器为loader1
MyClassLoader loader2 = new MyClassLoader(loader1, "loader2");
loader2.setPath("D:/lib2/");
//loader3的父加载器为根类加载器
MyClassLoader loader3 = new MyClassLoader(null, "loader3");
loader3.setPath("D:/lib3/");
Class clazz = loader2.loadClass("Sample");
Object object = clazz.newInstance();
}
}
public class Sample {
public Sample(){
System.out.println("Sample is loaded by " + this.getClass().getClassLoader());
new A();
}
}
public class A {
public A(){
System.out.println("A is loaded by " + this.getClass().getClassLoader());
}
}
当执行loader2.loaderClass("Sample")时,先由它上层的所有父加载器尝试加载Sample类。loader1从D:/lib1/目录下成功的加载了Sample类,因此laoder1是Sample类的定义类加载器,loader1和loader2是Sample类的初始类加载器。
当执行loader3.loadClass("Sample")时,先由它上层的所有父加载器尝试加载Sample类。loader3的父加载器为根类加载器,它无法加载Sample类,接着loader3从D:/lib3/目录下成功地加载了Sample类,因此loader3是Sample类的定义类加载器即初始类加载器。
在Sample类中主动使用了A类,当执行Sample类的构造方法中的new A()语句时,Java虚拟机需要先加载Dog类,Java虚拟机会勇Sample类的定义类加载器去加载Dog类,加载过程也同样采用父亲委托机制。
2、不同类加载器的命名空间关系:
同一个命名空间内的类是相互可见的。
子加载器的命名空间包含所有父加载器的命名空间。因此子加载器加载的类能看见父加载器加载的类。例如系统类加载器加载的类能看见根类加载器加载的类。
由父加载器加载的类不能看见子加载器加载的类。
如果两个加载器之间没有直接或间接的父子关系,那么它们各自加载的类相互不可见。
当两个不同命名空间内的类相互不可见时,可以采用Java的反射机制来访问实例的属性和方法。
要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名字,返回对应的Class对象的引用。
findClass
protected Class<?> findClass(String name)
throws ClassNotFoundException
使用指定的二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被 loadClass 方法调用。默认实现抛出一个 ClassNotFoundException。
参数:
name - 类的二进制名称
返回:
得到的 Class 对象
抛出:
ClassNotFoundException - 如果无法找到类
从以下版本开始:
1.2
创建用户自定义的类加载器:
public class MyClassLoader extends ClassLoader {
//类加载器名称
private String name;
//加载类的路径
private String path = "D:/";
private final String fileType = ".class";
public MyClassLoader(String name){
//让系统类加载器成为该 类加载器的父加载器
super();
this.name = name;
}
public MyClassLoader(ClassLoader parent, String name){
//显示指定该类加载器的父加载器
super(parent);
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@Override
public String toString() {
return this.name;
}
/**
* 获取.class文件的字节数组
* @param name
* @return
*/
private byte[] loaderClassData(String name){
InputStream is = null;
byte[] data = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
this.name = this.name.replace(".", "/");
try {
is = new FileInputStream(new File(path + name + fileType));
int c = 0;
while(-1 != (c = is.read())){
baos.write(c);
}
data = baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
is.close();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return data;
}
/**
* 获取Class对象
*/
@Override
public Class<?> findClass(String name){
byte[] data = loaderClassData(name);
return this.defineClass(name, data, 0, data.length);
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//loader1的父加载器为系统类加载器
MyClassLoader loader1 = new MyClassLoader("loader1");
loader1.setPath("D:/lib1/");
//loader2的父加载器为loader1
MyClassLoader loader2 = new MyClassLoader(loader1, "loader2");
loader2.setPath("D:/lib2/");
//loader3的父加载器为根类加载器
MyClassLoader loader3 = new MyClassLoader(null, "loader3");
loader3.setPath("D:/lib3/");
Class clazz = loader2.loadClass("Sample");
Object object = clazz.newInstance();
}
}
public class Sample {
public Sample(){
System.out.println("Sample is loaded by " + this.getClass().getClassLoader());
new A();
}
}
public class A {
public A(){
System.out.println("A is loaded by " + this.getClass().getClassLoader());
}
}
当执行loader2.loaderClass("Sample")时,先由它上层的所有父加载器尝试加载Sample类。loader1从D:/lib1/目录下成功的加载了Sample类,因此laoder1是Sample类的定义类加载器,loader1和loader2是Sample类的初始类加载器。
当执行loader3.loadClass("Sample")时,先由它上层的所有父加载器尝试加载Sample类。loader3的父加载器为根类加载器,它无法加载Sample类,接着loader3从D:/lib3/目录下成功地加载了Sample类,因此loader3是Sample类的定义类加载器即初始类加载器。
在Sample类中主动使用了A类,当执行Sample类的构造方法中的new A()语句时,Java虚拟机需要先加载Dog类,Java虚拟机会勇Sample类的定义类加载器去加载Dog类,加载过程也同样采用父亲委托机制。
2、不同类加载器的命名空间关系:
同一个命名空间内的类是相互可见的。
子加载器的命名空间包含所有父加载器的命名空间。因此子加载器加载的类能看见父加载器加载的类。例如系统类加载器加载的类能看见根类加载器加载的类。
由父加载器加载的类不能看见子加载器加载的类。
如果两个加载器之间没有直接或间接的父子关系,那么它们各自加载的类相互不可见。
当两个不同命名空间内的类相互不可见时,可以采用Java的反射机制来访问实例的属性和方法。
发表评论
-
一个优秀的Java程序员必须了解GC机制
2015-01-16 17:04 1582一个优秀的Java程序员必须了解GC的工作原理、如何优化GC ... -
jvm的内存分配及运行机制(转)
2014-12-18 15:13 874http://www.cnblogs.com/200911 ... -
深入Java虚拟机之内存优化
2013-05-16 16:00 925前面一篇文章介绍了Java虚拟机的体系结构和内存模型,既然提 ... -
深入Java虚拟机之虚拟机体系结构
2013-05-16 16:00 926工作以来,代码越写越多,程序也越来越臃肿,效率越来越低,对于 ... -
JAVA虚拟机内存分配与回收机制
2013-05-16 15:19 1026https://www.ibm.com/develope ... -
Java类加载器介绍
2013-04-16 11:19 900类加载器负责把类加载到Java虚拟机(JVM)中。指定类 ... -
JVM加载class文件的原理
2013-03-20 09:50 1395url:http://hxraid.iteye.com/b ... -
Java类加载机制深度分析
2013-03-05 23:00 912Java类加载机制 类加载 ... -
一次Java垃圾收集调优实战(转江南白衣)
2012-10-22 21:19 11271 资料 JDK5.0垃圾收集优化之--Don' ... -
深入java虚拟机(圣思园)
2012-06-06 12:01 16491.Java虚拟机与程序的 ... -
深入java虚拟机
2012-06-06 09:33 1204类的运行步骤: 1.加载(从硬盘到内存)----> ... -
jvm调优
2012-03-18 23:22 1174堆大小设置 JVM 中最大 ... -
JVM虚拟机如何来初始化构造方法的
2012-03-18 16:24 1016面先说一下环境,比如现在有两个类,A和B,两个类都是单例类,这 ... -
Java虚拟机 原理
2012-02-20 14:05 981Java技术与Java虚拟机 本文转自:http://w ...
相关推荐
关于类加载器的 上课ppt -java虚拟机自带的加载器 根类加载器(Bootstrap) c++写的看不到扩展类加载器(extension) 系统类加载器(System) AppClassLoad 用户自定义的类加载器 Java.lang.ClassLoader的子类
自定义属性集合编辑器,支持两种方式(UserControl, Component)进行属性编辑并自动产生持久化代码。代码参考网络。
1):本地编译好的class中直接加载 2):网络加载:java.net.URLClassLoader可以加载url指定的类 3):从jar、zip等等压缩文件加载类,自动解析jar文件找到class文件...而由用户自定义的类加载器所加载的类会被卸载掉!
vb.net 自定义控件 自定义属性 UITypeEditor UI 类型编辑器 实例 提供一个示例 UITypeEditor,它使用 IWindowsFormsEditorService 显示用于用户输入的 Form。 IWindowsFormsEditorService 只能通过 PropertyGrid ...
2.11.2 加载和存储指令 ........................................... 44 2.11.3 运算指令 ................................................ 45 2.11.4 类型转换指令 ..............................................
// 自定义图片加载器 ISNav . getInstance() . init( new ImageLoader () { @Override public void displayImage ( Context context , String path , ImageView imageView ) { Glide . with(cont
类加载器分为:Java虚拟机自带的加载器和用户自定义的类加载器; Java虚拟机自带的类加载器包括:启动类加载器,扩展类加载器,系统类加载器三种。 用户自定义的类加载器是ClassLoader类的实例,通过它来定制类的...
自定义工作流设计器完全采用自定义活动,让用户不写代码,通过拖拽一些活动,然后生成dll文件,动态加载到宿主中就可以运行
重要的! 在2.0中,已删除nuxt模块。 原因是您真的不需要它。 只需将其用作vue插件即可。 ... 通过自定义类名称进行单独的预加载器自定义样式。 自定义过渡。 使用返回的回调轻松关闭。 和更多
类加载器2.1 类加载器种类2.1.1 Java虚拟机自带的类加载器2.1.2 用户自定义的类加载器2.2 双亲委派机制2.2.1 为什么要有双亲委派机制2.2.2 可不可以自定义一个String/Object类?2.3 破坏双亲委派2.3.1 为何要破坏...
使用图层蒙版实现的iOS自定义加载器 演示: 这是自定义加载的库,基于“尼克·伍德(Nick Lockwood)”的“ iOS核心动画:高级技术”一书中的引用。 所有动画均基于CALayer对象的mask属性。 遮罩最初设置为零,...
ImageSelector Android 图片选择器。...// 自定义图片加载器 private ImageLoader loader = new ImageLoader() { @Override public void displayImage(Context context, String path, ImageView i
GMS引导加载器(gms-bootstrap-loader.cpg)—— 使用C++编写的CPG插件,该插件是一个“让GMS插件能自动运行的插件”,只有一个核心功能:强制加载VBA模块,绕过CDR软件中设置的延迟加载VBA选项,使用户自己编写的...
因此,现在我正在使用和生成案例类的字节码,并使用自定义类加载器加载新创建的类。 动态生成的类可用于在运行时实例化新对象,或用作类型参数。 请参阅下面的警告。 支持生成具有以下数据类型的任意字段的类: ...
该插件使用官方的播放列表加载器在Beat Saber中加载自定义播放列表文件。 此mod不能替代PlaylistCore,并且不会加载本地不可用的歌曲。 相反,它是为那些希望使用更轻量级的mod来在游戏的本机播放列表UI中加载播放...
RL Epic Games自定义地图加载器 Epic Games用户可以通过Steam Workshop将任何自定义地图加载到Rocket League中的新解决方法 安装和运行应用程序 下载或克隆此仓库 确保已安装Python 3: : 以及Tkinter: : 您可以...
系统集成强大的编辑器功能,用户发布信息时可直接进行文字的排版处理,还可以在线对图片进行简单处理。系统支持插入图片、Flash、附件、音频视频、超链接、表格等等。折扣信息网站源码,供求源码,asp.net版供求信息...
税收元类 贡献者:bainternet至少需要:3.5经测试:4.0 描述 通过将Tax Meta Class包含在插件...2.0.2修复了jQuery用户界面未加载主题和更好的jQuery用户界面对WP版本的处理的问题。 添加了一个过滤器挂钩,以更改jQuer
自定义类加载器实现类的加载 & 热替换,通过反射实现 main 方法的运行。 解决多用户同时发送执行代码请求时的并发问题: 通过 ThreadLoacl 实现线程封闭,为每个请求创建一个输出流存储标准输出及标准错误结果。 ...