Test1.java:
package test;
import java.io.*;
import java.lang.reflect.*;
class AClassLoader extends ClassLoader {
public Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class klass = null;
try {
klass = findLoadedClass(name); //检查该类是否已经被装载。
if (klass != null) {
return klass;
}
byte[] bs = getClassBytes(name);//从一个特定的信息源寻找并读取该类的字节。
if (bs != null && bs.length > 0) {
klass = defineClass(name, bs, 0, bs.length);
}
if (klass == null) { //如果读取字节失败,则试图从JDK的系统API中寻找该类。
klass = findSystemClass(name);
}
if (resolve && klass != null) {
resolveClass(klass);
}
} catch (IOException e) {
throw new ClassNotFoundException(e.toString());
}
System.out.println("klass == " + klass);
return klass;
}
private byte[] getClassBytes(String className) throws IOException {
String path = System.getProperty("java.class.path") + File.separator;
path += className.replace('.', File.separatorChar) + ".class";
System.out.println(path);
FileInputStream fis = null;
try {
fis = new FileInputStream(path);
} catch (FileNotFoundException e) {
System.out.println(e);
return null; //如果查找失败,则放弃查找。捕捉这个异常主要是为了过滤JDK的系统API。
}
byte[] bs = new byte[fis.available()];
fis.read(bs);
return bs;
}
}
public class Test1 {
public static void main(String[] args) throws Exception{
AClassLoader loader = new AClassLoader();
Class c = loader.loadClass("test.A", false);
System.out.println(c);
Object o = c.newInstance();
System.out.println(o);
Method m = c.getMethod("print", java.lang.String.class);
m.invoke(o, "bitan");
}
}
A.java
package test;
public class A {
public void print(String str) {
System.out.println("嗨," + str + ", 你终于找到我了!");
}
public String toString() {
return "我是一个A对象!";
}
}
结果:
C:\test>javac -d .\bin .\src\*.java
C:\test>java -classpath .\bin test.Test1
.\bin\test\A.class
.\bin\java\lang\Object.class
java.io.FileNotFoundException: .\bin\java\lang\Object.class (系统找不到指定的路
径。)
klass == class java.lang.Object
klass == class test.A
class test.A
我是一个A对象!
.\bin\java\lang\String.class
java.io.FileNotFoundException: .\bin\java\lang\String.class (系统找不到指定的路
径。)
klass == class java.lang.String
.\bin\java\lang\System.class
java.io.FileNotFoundException: .\bin\java\lang\System.class (系统找不到指定的路
径。)
klass == class java.lang.System
.\bin\java\lang\StringBuilder.class
java.io.FileNotFoundException: .\bin\java\lang\StringBuilder.class (系统找不到指
定的路径。)
klass == class java.lang.StringBuilder
.\bin\java\io\PrintStream.class
java.io.FileNotFoundException: .\bin\java\io\PrintStream.class (系统找不到指定的
路径。)
klass == class java.io.PrintStream
嗨,bitan, 你终于找到我了!
C:\test>
分享到:
相关推荐
下面我们将详细讨论ClassLoader的基本概念、工作流程以及如何自定义ClassLoader。 1. **ClassLoader的基本概念** - 类加载器是Java中的一个核心组件,它负责将类的.class文件加载到JVM中,并转换为可执行的Java...
以下是一个简单的自定义ClassLoader示例,它能从指定的jar文件加载类: ```java public class MyClassLoader extends URLClassLoader { public MyClassLoader(String jarPath) throws MalformedURLException { ...
在这个简单的例子中,我们将探讨类加载器的基本概念、工作原理以及如何自定义类加载器。 类加载器的主要任务是查找并加载类的.class文件。Java中的类加载过程分为三个阶段:加载、验证、准备、解析和初始化。在我们...
本文将深入探讨Java中的类加载机制,并通过一个具体的自定义类加载器的例子来帮助理解其工作原理。 #### 二、Java类加载器的基本概念 Java中的类加载器主要负责完成以下三个基本任务: 1. **加载(Loading)**:...
Java 2引入的findClass方法使得创建自定义ClassLoader变得更加容易,我们只需要覆盖findClass,而无需完全实现loadClass,简化了过程。 自定义ClassLoader的工作原理是,首先创建一个ClassLoader的实例,然后使用这...
以下是一个简单的例子: ```java public class DynamicClassLoader extends ClassLoader { public Class<?> findClass(byte[] b) throws ClassNotFoundException { return defineClass(null, b, 0, b.length); }...
Java虚拟机规范定义了两类类加载器:启动类加载器(Bootstrap ClassLoader)和用户自定义类加载器(User-Defined ClassLoader)。 - **启动类加载器(Bootstrap ClassLoader)**:这是JVM自带的一个类加载器,用于加载...
"classloader-playground"项目的核心是一个简单的Java依赖隔离容器类。在实际开发中,我们常常需要隔离不同模块之间的依赖,避免版本冲突或循环依赖等问题。类加载器可以在这方面发挥重要作用,通过定制类加载器,...
`web_classloader_test`可能包含了这样的自定义类加载器的实现。 5. **热部署与热更新**:在开发阶段,开发者可能希望在不重启服务器的情况下更新代码。这就需要类加载器支持类的动态加载和卸载。这个测试可能包含...
本文将深入探讨自定义类加载器的基本概念、工作原理以及如何创建一个简单的基于磁盘的自定义类加载器。 ### 类加载器的层次结构 Java中的类加载器通常形成一个树状的层次结构,其中Bootstrap ClassLoader是最顶层...
下面是一个简单的自定义类加载器示例: ```java public class MyClassLoader extends ClassLoader { public MyClassLoader(ClassLoader parent) { super(parent); } @Override protected Class<?> findClass...
动态加载类通常涉及自定义ClassLoader,这是因为它允许我们覆盖默认的加载行为,例如从网络、数据库或其他非标准位置加载类。 对于Java源文件动态编译,我们可以使用Java的内置工具`javac`或`javax.tools.Java...
以下是一个简单的自定义类加载器示例,用于动态加载D盘下的A.class文件: ```java package jvm; import java.io.File; import java.io.FileInputStream; import java.lang.reflect.Method; import java.net.URL; ...
通过自定义ClassLoader,开发者可以实现更为复杂的应用架构,如插件系统、动态代码更新等,极大地提升了Java应用程序的可扩展性和维护性。在进行系统设计时,充分考虑类装载的原理和实现,可以帮助我们构建更加健壮...
本文主要探讨了Java代码执行漏洞中类动态加载的应用,特别是通过自定义ClassLoader和反射调用`defineClass`方法来实现字节码的动态解析。 首先,Java中类的加载方式有两种:显式加载和隐式加载。隐式加载通常发生在...
下面通过一个小例子测试这三个JVM自带的ClassLoader之间的关系: ```java public class ClassLoaderTest1 { public static void main(String[] args) { ClassLoader loader = ClassLoaderTest1.class....
在使用自定义 Classloader 加载 JAR 包时,我们需要实现一个自定义的 Classloader 类,并在其中加载要加载的 JAR 包。这种方法比较复杂,需要专门的讨论。 以上四种方法都可以用来执行 JAR 包,但是它们有不同的...
在这个例子中,“path_to_your_asset.dex”是位于Assets目录下的.dex文件路径,我们将其传递给DexClassLoader的构造函数。`getDir("dex", Context.MODE_PRIVATE)`用于创建一个私有的目录来存储优化后的.dex文件,...