import java.io.*;
import java.lang.reflect.*;
/**
*
* 这个例子中类加载顺序为BootstrapClassPath----ExtClassPath--SystemClassPath--CClassLoader
* --DClassLoader
* <p>
* 如果不想加载的指定类可以把CClassLoader 的 super.findClass
* 去掉,但是最好在前面加上findLoadedClass判断类是否已经加载过,防止重复加载
* <p>
* 一般而言编写classLoacer只需重载findClass方法即可,loadClass方法会调用findClass方法
* <p>
* 如果加载的不是一个class而是一个jar,可以使用URLClassLoader来加载jar包
* <p>
* 一般应该服务器会有热加载机制,每个应用服务器对webapp下面应用都会有自己的加载器,当class文件是否有修改,判断文件的lastModify()的修改时间,
* 如果是修改过则重新加载文件
* <p>
*
* @author Administrator
*
*/
// 寻找C盘class
class CClassLoader extends ClassLoader {
private final static String DIR_PATHC = "c:/java/";
protected Class<?> findClass(String s) {
Class cls = null;
try {
cls = super.findClass(s);
} catch (ClassNotFoundException e1) {
}
if (cls != null) {
System.out.println(super.getClass().getClassLoader() + " find "
+ s);
return cls;
} else {
System.out.println(super.getClass().getClassLoader() + " not find "
+ s);
}
byte[] bys = null;
try {
bys = getBytes(s);
cls = defineClass(null, bys, 0, bys.length);
} catch (IOException e) {
}
if (cls != null) {
System.out.println("CClassLoader find " + s);
} else {
System.out.println("CClassLoader not find " + s);
}
return cls;
}
// 从本地读取文
private byte[] getBytes(String className) throws IOException {
String path = DIR_PATHC + className + ".class";
File file = new File(path);
long len = file.length();
byte raw[] = new byte[(int) len];
FileInputStream fin = new FileInputStream(file);
int r = fin.read(raw);
if (r != len) {
throw new IOException("Can't read all, " + r + " != " + len);
}
fin.close();
return raw;
}
}
// 寻找D盘class
class DClassLoader extends CClassLoader {
private final static String DIR_PATHD = "d:/java/";
protected Class<?> findClass(String s) {
Class cls = null;
cls = super.findClass(s);
if(cls != null ){
return cls;
}
byte[] bys = null;
try {
bys = getBytes(s);
cls = defineClass(null, bys, 0, bys.length);
} catch (IOException e) {
e.printStackTrace();
}
if (cls != null) {
System.out.println("DClassLoader find " + s);
} else {
System.out.println("DClassLoader not find " + s);
}
return cls;
}
// 从本地读取文件
private byte[] getBytes(String className) throws IOException {
String path = DIR_PATHD + className + ".class";
File file = new File(path);
long len = file.length();
byte raw[] = new byte[(int) len];
FileInputStream fin = new FileInputStream(file);
int r = fin.read(raw);
if (r != len) {
throw new IOException("Can't read all, " + r + " != " + len);
}
fin.close();
return raw;
}
}
public class ClassLoaderTest {
public static void main(String[] args) throws Exception {
DClassLoader loader = new DClassLoader();
// Class c = loader.loadClass("java.lang.String"); Object o =
// c.newInstance();
Class c = loader.loadClass("LocalClass");
Object o = c.newInstance();
Method m = c.getMethod("getClass");
System.out.println(m.invoke(o));
}
}
分享到:
相关推荐
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得...通过深入研究"ClassLoader小例子",你可以更好地理解Java的类加载机制,并为自己的项目开发带来更多的灵活性。
《深入理解Java类加载器:基于classloader-playground开源项目》 在Java世界里,类加载器(ClassLoader)是理解JVM工作原理的关键一环。它负责将字节码文件(.class)从磁盘、网络或其他数据源加载到内存,并转化为...
总的来说,"classloader简单例子"为我们提供了一个学习和实践Java类加载机制的平台。通过这个例子,我们可以学习到如何自定义类加载器,如何处理类的加载过程,以及如何在特定场景下利用类加载器实现更复杂的功能。...
本文将深入探讨Java中的类加载机制,并通过一个具体的自定义类加载器的例子来帮助理解其工作原理。 #### 二、Java类加载器的基本概念 Java中的类加载器主要负责完成以下三个基本任务: 1. **加载(Loading)**:...
在Java编程环境中,ClassLoader是一个至关重要的组件,它负责加载类到Java虚拟机(JVM)中。当我们需要从外部jar包动态加载类时,自定义ClassLoader就显得尤为关键。这篇博文"定义ClassLoader调用外部jar包"探讨了...
Java的类加载是通过ClassLoader实现的,每个类在被使用之前都会由ClassLoader查找并加载。ClassLoader有三个基本职责: 1. 加载:寻找并加载类的字节码。 2. 验证:确保加载的字节码符合Java语法规则和安全约束。 3...
这个例子可能是针对`WebAppClassLoader`的测试。 3. **隔离性**:每个Web应用都有自己的类加载器,这样确保了不同应用间的类是相互独立的,即使它们使用了相同的名字。这就是为什么在同一个服务器上可以部署多个...
下面通过一个小例子测试这三个JVM自带的ClassLoader之间的关系: ```java public class ClassLoaderTest1 { public static void main(String[] args) { ClassLoader loader = ClassLoaderTest1.class....
总的来说,防止Java源码被偷窥的关键在于理解并利用Java的ClassLoader机制,结合加密技术,可以在不改变程序功能的前提下增强源码的安全性。通过自定义ClassLoader并实现即时解密,可以有效地保护代码免受反编译器的...
Java支持多种类加载器,包括启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。当类首次被引用时,对应的类加载器会查找并加载该类的...
在这个例子中,我们将探讨如何在Tomcat环境下实现Java类的热重载。 1. **Java ClassLoader原理** - Java程序在运行时,类的加载是由ClassLoader负责的。默认情况下,当类被加载后,除非应用停止,否则ClassLoader...
在Java中,可以通过`File`类的`getAbsolutePath()`方法获取文件的绝对路径,结合`Class.getResource()`或`ClassLoader.getResource()`方法,可以在给定类或类加载器上下文中找到文件的路径。 6. **集成到IDE**:这...
Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用方法时添加额外的功能或控制。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等。...
8. **ClassLoader类**:负责加载类到Java虚拟机中。它允许动态加载类,这对于插件系统和动态代码执行非常重要。 在"第六章Java.lang"的压缩包文件中,可能包含了上述各个类的实例代码和练习,帮助学习者通过实际...
在这个例子中,`MyClassLoader`继承了`ClassLoader`,并重写了`findClass`方法,从指定的文件路径加载类的字节码。在`main`方法中,我们使用自定义类加载器加载类,并调用其中的方法。 总结来说,理解Java类加载...
在我们的例子中,标题提到的"java 类从哪个jar包加载的",这通常涉及到类路径(ClassPath)的设置。类路径告诉JVM在哪里查找类文件。你可以通过`-cp`或`-classpath`命令行选项,或者在`JAVA_OPTS`环境变量中指定。...
在这个例子中,我们首先获取系统Java编译器实例,然后创建一个标准文件管理器,用于处理源文件对象。接着,我们将要编译的.java文件转换为`JavaFileObject`,并调用`compiler.compile()`进行编译。 编译完成后,...