`

自定义ClassLoader的简单例子

阅读更多

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的基本概念、工作流程以及如何自定义ClassLoader。 1. **ClassLoader的基本概念** - 类加载器是Java中的一个核心组件,它负责将类的.class文件加载到JVM中,并转换为可执行的Java...

    定义ClassLoader调用外部jar包

    以下是一个简单的自定义ClassLoader示例,它能从指定的jar文件加载类: ```java public class MyClassLoader extends URLClassLoader { public MyClassLoader(String jarPath) throws MalformedURLException { ...

    classloader简单例子

    在这个简单的例子中,我们将探讨类加载器的基本概念、工作原理以及如何自定义类加载器。 类加载器的主要任务是查找并加载类的.class文件。Java中的类加载过程分为三个阶段:加载、验证、准备、解析和初始化。在我们...

    java自定义类加载classloader文档,包括代码

    本文将深入探讨Java中的类加载机制,并通过一个具体的自定义类加载器的例子来帮助理解其工作原理。 #### 二、Java类加载器的基本概念 Java中的类加载器主要负责完成以下三个基本任务: 1. **加载(Loading)**:...

    如何有效防止Java程序源码被人偷窥.doc

    Java 2引入的findClass方法使得创建自定义ClassLoader变得更加容易,我们只需要覆盖findClass,而无需完全实现loadClass,简化了过程。 自定义ClassLoader的工作原理是,首先创建一个ClassLoader的实例,然后使用这...

    关于java热部署知识.doc

    以下是一个简单的例子: ```java public class DynamicClassLoader extends ClassLoader { public Class<?> findClass(byte[] b) throws ClassNotFoundException { return defineClass(null, b, 0, b.length); }...

    classloader-playground, 一个简单的java依赖隔离容器类.zip

    "classloader-playground"项目的核心是一个简单的Java依赖隔离容器类。在实际开发中,我们常常需要隔离不同模块之间的依赖,避免版本冲突或循环依赖等问题。类加载器可以在这方面发挥重要作用,通过定制类加载器,...

    web_classloader_test.zip_web classloader

    `web_classloader_test`可能包含了这样的自定义类加载器的实现。 5. **热部署与热更新**:在开发阶段,开发者可能希望在不重启服务器的情况下更新代码。这就需要类加载器支持类的动态加载和卸载。这个测试可能包含...

    自定义类加载器

    本文将深入探讨自定义类加载器的基本概念、工作原理以及如何创建一个简单的基于磁盘的自定义类加载器。 ### 类加载器的层次结构 Java中的类加载器通常形成一个树状的层次结构,其中Bootstrap ClassLoader是最顶层...

    自定义类加载代码

    下面是一个简单的自定义类加载器示例: ```java public class MyClassLoader extends ClassLoader { public MyClassLoader(ClassLoader parent) { super(parent); } @Override protected Class<?> findClass...

    Java类动态加载(一)——java源文件动态编译为class文件

    动态加载类通常涉及自定义ClassLoader,这是因为它允许我们覆盖默认的加载行为,例如从网络、数据库或其他非标准位置加载类。 对于Java源文件动态编译,我们可以使用Java的内置工具`javac`或`javax.tools.Java...

    ClassLoader实例

    以下是一个简单的自定义类加载器示例,用于动态加载D盘下的A.class文件: ```java package jvm; import java.io.File; import java.io.FileInputStream; import java.lang.reflect.Method; import java.net.URL; ...

    Java虚拟机类装载:原理、实现与应用

    通过自定义ClassLoader,开发者可以实现更为复杂的应用架构,如插件系统、动态代码更新等,极大地提升了Java应用程序的可扩展性和维护性。在进行系统设计时,充分考虑类装载的原理和实现,可以帮助我们构建更加健壮...

    Java代码执行漏洞中类动态加载的应用1

    本文主要探讨了Java代码执行漏洞中类动态加载的应用,特别是通过自定义ClassLoader和反射调用`defineClass`方法来实现字节码的动态解析。 首先,Java中类的加载方式有两种:显式加载和隐式加载。隐式加载通常发生在...

    ClassLoader in OSGI

    下面通过一个小例子测试这三个JVM自带的ClassLoader之间的关系: ```java public class ClassLoaderTest1 { public static void main(String[] args) { ClassLoader loader = ClassLoaderTest1.class....

    java命令执行jar包的多种方法(四种方法)

    在使用自定义 Classloader 加载 JAR 包时,我们需要实现一个自定义的 Classloader 类,并在其中加载要加载的 JAR 包。这种方法比较复杂,需要专门的讨论。 以上四种方法都可以用来执行 JAR 包,但是它们有不同的...

    DexClassLoader自定义加载Assets目录下的dex、jar文件

    在这个例子中,“path_to_your_asset.dex”是位于Assets目录下的.dex文件路径,我们将其传递给DexClassLoader的构造函数。`getDir("dex", Context.MODE_PRIVATE)`用于创建一个私有的目录来存储优化后的.dex文件,...

Global site tag (gtag.js) - Google Analytics