闲来无事,看看jvm,看到自定义的classLoder,就写了一个实例,希望对大家有所帮助,欢迎批评指正
首先,自定义的classloader需要继承java的classLoder类,同时覆写findClass方法,废话不说了,直接上代码
MyClassLoader:自定义的classloader
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* 自定义classloader
* @author liuxiaochen
*
*/
public class MyClassLoader extends ClassLoader
{
String path = "d:\\";
String name;
String fileType = ".class";
public MyClassLoader(String name) {
super() ;
this.name = name ;
}
public MyClassLoader(ClassLoader classloader, String name) {
super(classloader) ;
this.name = name ;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException
{
byte[] data = loadClassData(name) ;
return defineClass(name, data, 0, data.length) ;
}
@Override
public String toString()
{
return this.name ;
}
private byte[] loadClassData(String name)
{
byte[] data = null;
InputStream in = null;
ByteArrayOutputStream baos = null;
try
{
this.name = this.name.replace(".", "\\");
in = new FileInputStream(new File(path + name + fileType));
baos = new ByteArrayOutputStream();
int cnt = 0;
while (-1 != (cnt = in.read()))
{
baos.write(cnt);
}
data = baos.toByteArray();
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
} finally
{
try
{
in.close() ;
baos.close() ;
} catch (IOException e)
{
e.printStackTrace();
}
}
return data;
}
public String getPath()
{
return path;
}
public void setPath(String path)
{
this.path = path;
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException
{
MyClassLoader loader1 = new MyClassLoader("loader1") ;
loader1.setPath("d:\\myapp\\loader1lib\\") ;
MyClassLoader loader2 = new MyClassLoader(loader1, "loader2") ;
loader2.setPath("d:\\myapp\\loader2lib\\") ;
MyClassLoader loader3 = new MyClassLoader(null, "loader3") ;
loader3.setPath("d:\\myapp\\syslib\\") ;
System.out.println("-------------");
test(loader1) ;
System.out.println("-------------");
test(loader2) ;
System.out.println("-------------");
// test(loader3) ;
}
public static void test(ClassLoader classloder) throws ClassNotFoundException, InstantiationException, IllegalAccessException
{
Class<?> classzz = classloder.loadClass("Sample") ;
Object instance = classzz.newInstance() ;
}
}
其实java的jdk上已经给了一个实例,如下,不过只是框架,代码啥的自己写就行,
网络类加载器子类必须定义方法 findClass 和 loadClassData,以实现从网络加载类。下载组成该类的字节后,它应该使用方法 defineClass 来创建类实例。示例实现如下:
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
好了,自定义的classLoder写好了
写两个测试的类,做一下
public class Sample
{
public Sample()
{
System.out.println("sample is loader by" + this.getClass().getClassLoader());
new Dog() ;
}
}
public class Dog
{
public Dog()
{
System.out.println("dog is loader by " + this.getClass().getClassLoader());
}
}
行了,剩下的,就比较简单了,测试吧,把class文件分别放到设置好的路径下,试试自定义的classloder吧
不吝赐教
分享到:
相关推荐
以"InternalsOfClassloadingSrc"为例,这可能是一个包含了自定义ClassLoader源代码的项目。在这个项目中,我们可以创建一个新的ClassLoader类,覆盖其`loadClass()`方法,实现我们的加载逻辑。我们可能需要读取...
### Java自定义类加载器(Class Loader)详解 #### 一、引言 在Java语言中,类加载机制是其动态特性的核心之一。通过类加载器(Class Loader),Java程序能够在运行时根据需要加载所需的类,从而实现高度的灵活性...
验证是为了确保即将执行的字节码符合Java虚拟机规范,防止恶意代码对系统的破坏。准备阶段会为类的静态变量分配内存并设置默认初始值,如int类型的变量默认值为0。解析阶段则主要处理符号引用转为直接引用。 **知识...
自定义ClassLoader是Java灵活性的一个体现,开发者可以通过继承ClassLoader类并重写findClass()方法来自定义类的加载方式,例如从网络、数据库或者特定目录加载类。 接下来,我们讨论类变量初始化的顺序。Java中,...
Java 中的 ClassLoader 是一个非常重要的组件,它负责动态加载 class 文件到虚拟机当中,并将其转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类,因此我们可以根据 Class 的实例可以得到...
在压缩包中的`MyClassLoader`文件,可能是实现自定义ClassLoader的源代码。这个类可能会包含以下部分: 1. 类加载器的实例化和配置,包括指定加载类的目录。 2. 对`loadClass()` 和 `findClass()` 的覆写,实现...
在Java中,每个类都是由一个ClassLoader实例加载的。系统中存在三种基本的ClassLoader: 1. Bootstrap ClassLoader:这是最基础的类加载器,由JVM本身实现,负责加载JRE的`<JAVA_HOME>/lib`目录下的核心类库,或者...
Java程序中的每个类都由某个ClassLoader实例加载。 - JVM中有三个内置的ClassLoader:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoder。 - Bootstrap ClassLoader加载JDK的核心库,如rt.jar。 - ...
对于标题“Java SE: ...- 模块化/插件化:对于需要模块化或插件化的应用程序,可以通过自定义ClassLoader实现模块的热加载或动态卸载。 深入理解ClassLoader机制对于开发大型、复杂或动态可扩展的Java应用非常重要。
Java自定义类加载器代码示例 Java自定义类加载器代码示例是一种使用Java语言实现的类加载器示例,主要用于加载Java类文件。类加载器是Java虚拟机(JVM)中的一种机制,用于将Java类文件加载到JVM中,以便JVM可以...
下面将通过一个简单的示例来展示如何使用自定义ClassLoader来实现Java源代码的加密与解密。 1. **创建自定义ClassLoader**: - 自定义ClassLoader需要重写`findClass`方法来处理加密后的类文件。 - 在`findClass`...
Java的ClassLoader是Java虚拟机(JVM)的重要组成部分,它负责加载类到内存中以便执行。不同于C或C++程序,Java程序由...通过编写自定义ClassLoader,开发者可以灵活地扩展Java平台的能力,以适应各种各样的应用场景。
自定义ClassLoader的工作原理是,首先创建一个ClassLoader的实例,然后使用这个实例来加载特定的类。这样,JVM会使用我们的自定义加载器来处理类文件,包括解密操作。Listing 1展示了如何使用自定义ClassLoader加载...
一个ClassLoader实例通常对应一个类加载的命名空间,一旦创建,其生命周期就开始了。除非应用程序显式卸载,否则ClassLoader通常不会被垃圾收集。 8. 热部署与类重加载: 在开发环境中,热部署允许开发者修改代码...
它需要三个参数:代理对象所实现的接口列表、一个`ClassLoader`(用于加载代理类)和一个`InvocationHandler`实例。这个方法会返回一个新的代理对象,该对象在运行时会动态生成一个实现了指定接口的类,这个类会将...
自定义ClassLoader是Java平台的一大特色,开发人员可以根据需要创建自己的类加载器,例如实现模块化、热部署或者加密解密类等高级功能。自定义ClassLoader通常需要重写findClass()或loadClass()方法,以控制类的加载...
要实现类的动态加载,开发者可以创建自定义类加载器,继承`java.lang.ClassLoader`类,并重写其`findClass`或`loadClass`方法。动态加载类通常应用于热更新、插件系统等场景,例如Tomcat和WebLogic服务器就是通过...
三、自定义ClassLoader 1. 继承ClassLoader:为了实现特定的加载策略,如从网络加载类、从加密数据加载类等,可以继承ClassLoader并重写`findClass()`方法。 2. URLClassLoader:Java提供了一个内置的...