分别把相同的类放在不同的目录下,分别答应不同的类容
public class HelloClassLoader{ public static void main(String[]args){ System.out.println("i am in bootclassloader"); } }如图
可以证明类加载器是从顶向下加载的
建立4个类代码分别如下:
第一个类:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Worker {
public void doit(){
Calendar cd = Calendar.getInstance();
cd.setTime(new Date());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
String date=sdf.format(new Date());
System.out.println("hello do it==" + date);
}
}
public class MyClassLoader extends ClassLoader {
public Class<?> findClass(byte[] b) throws ClassNotFoundException {
return defineClass(null, b, 0, b.length);
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* 自定义类加载
* @Author:xuehan
* @Date:2016年2月27日下午5:00:38
*/
public class MyclassLoaderUtils{
// 最后一次被修改时间
long lastmTime = System.currentTimeMillis();
// 判断class文件是否被修改过
public boolean isClassModified(String fileName){
File file = new File(fileName);
if(file.lastModified() - lastmTime > 0){
System.out.println("文件被修改");
lastmTime = System.currentTimeMillis();
return true;
}
return false;
}
// 从本地读取文件
@SuppressWarnings("unused")
private byte[] getClassBytes(String filename) throws IOException {
File file = new File(filename);
long len = file.length();
lastmTime = file.lastModified();
byte raw[] = new byte[(int) len];
FileInputStream fin = new FileInputStream(file);
int r = fin.read(raw);
fin.close();
return raw;
}
//加载类, 如果类文件修改过加载,如果没有修改,返回当前的
public Class loadClass(String name) throws ClassNotFoundException, IOException{
Class c = null;
if (isClassModified(name)){
MyClassLoader mc = new MyClassLoader();
return c = mc.findClass(getClassBytes(name));
}
return c;
}
第四个类:
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 虚拟机加载入口的地方
* @Author:xuehan
* @Date:2016年2月27日下午5:33:14
*/
public class HelloMain {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args)
throws ClassNotFoundException, IOException, NoSuchMethodException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException, InstantiationException, InterruptedException {
String path = "D:\\Users\\workspace\\jvm\\src\\main\\java\\com\\jvm\\day3\\Worker.class";
MyclassLoaderUtils mc = new MyclassLoaderUtils();
while (true) {
Class c = mc.loadClass(path);
if(null == c){
c = Worker.class;
}
Object o = c.newInstance();
Method m = c.getMethod("doit");
m.invoke(o);
Thread.sleep(2000);
}
}
}
相关推荐
当类不再被使用且满足特定条件(如类加载器被垃圾收集)时,JVM可能会卸载类,释放其所占的内存。 类加载器在类加载过程中扮演重要角色,它负责找到类的字节流并将其转换为运行时可用的形式。系统提供了几个内置类...
- **引导类加载器**(Bootstrap ClassLoader):负责加载JVM运行必需的核心类库,如rt.jar,这部分由C++实现,不在Java代码中直接可见。 - **扩展类加载器**(Extension ClassLoader):加载JRE的lib/ext目录下的...
- 双亲委派模型:当一个类加载器需要加载类时,它会先委托父加载器去尝试加载,只有当父加载器无法加载时,子加载器才会尝试加载。 - 类加载的三个阶段:加载、验证、准备、解析和初始化。 5. **JVM优化**: - ...
Class Loader(类加载器) Class Loader 负责将 Java 字节码文件加载到内存中,并将其放在 Runtime Data Area 中的方法区内。它根据给定的全限定名类名来装载 Class 文件。 ### 2. Execution Engine(执行引擎) ...
在Java虚拟机(JVM)中,类装载器(ClassLoader)是至关重要的组成部分,它负责查找和加载Java类到JVM内存中。本教程聚焦于深入理解JVM内核,特别是类装载器的原理、诊断与优化。在这个第六部分中,我们将探讨以下几...
7. **类加载器管理**:类加载器的不当使用可能导致内存泄漏,因此需要关注类的加载和卸载过程,避免长时间存活的类加载器持有大量不再使用的对象。 8. **代码优化**:避免不必要的大对象创建,减少长生命周期对象,...
Bootstrap ClassLoader是JVM启动时的第一个类加载器,负责加载JDK的`<JAVA_HOME>/jre/lib`目录下的核心类库。Extension ClassLoader加载`<JAVA_HOME>/jre/lib/ext`目录下的扩展类库。AppClassLoader(也叫System ...
6. **类加载器与热部署**: 在JDK源码中,类加载机制也为动态替换和更新类提供了可能,这在应用服务器的热部署场景中尤为重要。通过替换类加载器或者重新加载类,可以在不重启应用的情况下更新代码。 7. **双亲...
总之,Java类的加载机制是JVM的关键组成部分,它涉及到类的获取、验证、准备、解析和初始化,以及类加载器的选择和控制。理解这一机制对于优化应用程序性能、保证代码安全和实现动态扩展具有重要意义。
- 类加载器:BootStrapClassLoader、ExtClassLoader、AppClassLoader和自定义ClassLoader,它们各自有特定的加载职责,比如加载核心库、扩展库、第三方库和用户自定义类。 - 双亲委派模型:类加载时先询问父加载器...
1. jconsole:提供了一个图形界面来监控JVM的性能和资源消耗,例如内存使用、线程使用情况以及类加载情况。 2. jvisualvm:是一个更为全面的监控和故障排查工具,支持多种插件,可以查看本地和远程JVM的详细性能和...
#### 六、类加载器的委托模型 类加载器遵循双亲委派模型(Parent Delegation Model),即子类加载器首先请求父类加载器加载类,只有当父类加载器无法完成加载时,子类加载器才会尝试自己加载。这种模型确保了类的...
- **职责划分**:每个加载器有特定加载范围,如核心库、扩展库、第三方库和用户自定义类。 - **懒加载**:按需加载,节省内存资源。 5. **双亲委派模型** - 类加载时,先由父加载器尝试加载,若未加载过,则逐级...
#### 六、类加载器的应用场景 类加载器在实际应用中有多种应用场景,例如: - **Web容器中的类隔离**:不同的Web应用部署在同一台服务器上时,每个应用都有自己的类加载器,从而实现了类的隔离。 - **热部署**:...
- 自定义类加载器:了解如何编写自己的类加载器,以实现特定的类加载逻辑。 - 双亲委派模型:理解类加载过程中的类查找顺序,以及如何打破这个模型。 5. **JIT编译器**: - 编译触发条件:何时将字节码转化为...
第6节杂谈 [免费观看] 00:12:37分钟 | 第7节Java的发展历史00:27:24分钟 | 第8节Java的发展历史续00:02:27分钟 | 第9节Java技术体系00:08:46分钟 | 第10节jdk8的新特性00:07:31分钟 | 第11节lanmbda表达式简介...
- 类加载机制:探讨了类加载器如何加载类到JVM,包括启动类加载器、扩展类加载器和应用类加载器的工作流程。 - 字节码执行引擎:解析了字节码指令集,解释如何执行方法和处理异常。 - 内存模型:讲解了堆内存、栈...
- **JVisualVM**:集成了多种JVM监控功能,如内存、线程、类加载、CPU使用率等。 - **JConsole**:提供GUI界面来监视JVM的性能和诊断问题。 - **JMX(Java Management Extensions)**:允许创建和注册MBeans来...