`
lihaibingqq789
  • 浏览: 19797 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

classLoader的动态加载实例

阅读更多
第一步:自定义一个类加载器
public class DynamicClassLoader extends ClassLoader{

public Class<?> findClass(byte[] b) throws ClassNotFoundException {
        return defineClass(null, b, 0, b.length);
    }
}

第二步:创建一个管理类加载的类
package com.lhb;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ManageClassLoader {

private DynamicClassLoader dc =null;

private Long lastModified = 0l;
private Class<?> c = null;

/**
* 加载类, 如果类文件修改过加载,如果没有修改,返回当前的
* */
public Class<?> loadClass(String fileName) throws ClassNotFoundException, IOException {
if (isClassModified(fileName)) {
dc = new DynamicClassLoader();
c = dc.findClass(getBytes(fileName));
}
return c;
}

/**
* 判断是否被修改过
* */
private boolean isClassModified(String fileName) {

boolean returnValue = false;
File file = new File(fileName);
if (file.lastModified() > lastModified) {
returnValue = true;
}
return returnValue;
}

/**
* 从本地读取文件
* */
private byte[] getBytes(String fileName) throws IOException {
File file = new File(fileName);

long len = file.length();

lastModified = file.lastModified();
byte[] buf = new byte[(int)len];
FileInputStream fis = new FileInputStream(file);
int r = fis.read(buf);
if (r != len) {
throw new IOException("Can't read all, " + r + " != " + len);
}
fis.close();
return buf;

}

public static void main(String[] args) throws ClassNotFoundException,
IOException, InstantiationException,
IllegalAccessException,
SecurityException, NoSuchMethodException,
IllegalArgumentException,
InvocationTargetException,
InterruptedException {

String path = "E:\\workspace_java\\Test_study\\bin\\com\\lhb\\LocalClass.class";
ManageClassLoader mc = new ManageClassLoader();
while(true){
Class<?> c = mc.loadClass(path);
// 创建实例
Object o = c.newInstance();
Method m = c.getMethod("getName");
// 反射
m.invoke(o);
System.out.println(c.getClassLoader());
Thread.sleep(5000);

}
}
}
0
3
分享到:
评论

相关推荐

    Java ClassLoader定制实例

    接着,Extension ClassLoader加载扩展类库,然后是App ClassLoader加载应用程序的类路径下的类。每个ClassLoader都有其父ClassLoader,它们形成了一个层次结构,子ClassLoader可以委托父ClassLoader去加载类,避免了...

    ClassLoader类加载器

    在Java中,每个类都是由一个ClassLoader实例加载的。系统中存在三种基本的ClassLoader: 1. Bootstrap ClassLoader:这是最基础的类加载器,由JVM本身实现,负责加载JRE的`&lt;JAVA_HOME&gt;/lib`目录下的核心类库,或者...

    浅谈Android Classloader动态加载分析

    Android Classloader动态加载分析 Android Classloader动态加载分析是Android应用程序中一个非常重要的知识点。ClassLoader是Java虚拟机(JVM)中的一种机制,负责加载Java类文件到内存中,并将其转换为java.lang....

    动态加载jar包

    在Java中,动态加载jar包的核心在于使用`java.lang.ClassLoader`类或其子类。ClassLoader是Java虚拟机(JVM)的一部分,负责将类的字节码加载到JVM中并转换为Class对象。默认情况下,JVM会使用系统类加载器来查找和...

    ClassLoader(类加载机制)1

    Bootstrap ClassLoader负责加载JDK的核心库,Extension ClassLoader加载Java的扩展库,而App ClassLoader则加载应用的类路径下的类。用户还可以自定义类加载器,用于加载特定位置或格式的类。 2. **Java类** Java...

    Java 动态加载jar文件示例

    这里的`Class.forName()`方法使用了我们的自定义类加载器来加载类,并创建实例。 标签“Java 动态加载”不仅涵盖了上述的基础知识,还可能涉及更高级的话题,如类加载器的线程安全、双亲委派模型的打破以及如何处理...

    classloader类加载器_基于java类的加载方式详解

    比如,如果用户尝试使用Application ClassLoader加载rt.jar中的类,这个请求会被委派到Extension ClassLoader,最终到达Bootstrap ClassLoader,它会首先检查自己是否已经加载了这个类,如果已经加载,那么就不会...

    Android中的动态加载机制(折腾版) 源码

    3. 实现类的动态实例化:通过自定义ClassLoader加载的类,可以使用Class.forName()方法获取其Class对象,然后通过newInstance()创建实例。 四、测试与实践 在提供的压缩包中,load.jar和test.jar可能是包含待动态...

    动态加载Apk、Jar

    4. **加载Apk中的类**:通过自定义ClassLoader实例的loadClass()方法,可以加载Apk中的任何类。 5. **执行Apk中的方法**:一旦类被加载,就可以像普通类一样调用其中的方法。 **动态加载Jar** 加载Jar包的过程与...

    详解Java动态加载数据库驱动

    总结来说,Java动态加载数据库驱动的核心在于利用 `ClassLoader` 在运行时加载特定的数据库驱动类,避免了因为静态加载所有驱动而可能导致的冲突问题,提高了代码的灵活性和适应性。同时,这种方式还允许在运行时...

    动态加载apk demp

    动态加载需要创建新的ClassLoader来加载新APK中的.dex文件。通过 DexClassLoader 或其子类,如PathClassLoader,我们可以加载外部存储上的APK并执行其中的代码。 5. **权限处理**: 动态加载的APK需要处理权限问题...

    Java中ClassLoader类加载学习总结

    findClass方法是ClassLoader类的核心方法,该方法会尝试加载指定的类,如果加载成功则返回该类的实例,否则抛出ClassNotFoundException。 知识点七:双亲委派模型的优点 双亲委派模型的优点是可以避免类的重复加载...

    ClassLoader实例

    要实现类的动态加载,开发者可以创建自定义类加载器,继承`java.lang.ClassLoader`类,并重写其`findClass`或`loadClass`方法。动态加载类通常应用于热更新、插件系统等场景,例如Tomcat和WebLogic服务器就是通过...

    android动态加载jar

    2. 创建DexClassLoader实例,传入JAR文件路径、基类加载器、优化后的DEX文件路径和临时目录。 ```java File jarPath = new File("/path/to/your.jar"); File optimizedDexPath = context.getDir("optimized", ...

    JVM ClassLoader简析

    这种委托加载机制保证了类的唯一性,防止了同一个类被不同ClassLoader加载两次的问题。 ClassLoader还有自定义的概念,允许开发者创建自己的ClassLoader来实现特定的加载逻辑。例如,从网络、数据库或特定文件系统...

    JAVA动态加载JAR zip包

    - 然后,你可以像使用任何其他Java对象一样使用这个动态加载的类的实例。 5. **安全性与隔离** - 动态加载的类可以实现沙箱安全,通过限制类加载器的权限,防止恶意代码执行。 - 不同的类加载器加载的类被视为...

    动态加载demo

    在Android开发中,动态加载...综上所述,“动态加载demo”为我们提供了一个实践动态加载技术的实例,通过学习和理解这个示例,开发者可以更好地掌握如何在Android应用中实现动态加载,以提升应用的灵活性和可维护性。

    动态加载activity

    Android系统在启动Activity时,会通过ClassLoader加载对应的Activity类。如果我们能够自定义ClassLoader,就可以在运行时决定加载哪个Activity类,从而实现动态加载。 首先,我们需要创建一个基础的HostActivity,...

    动态加载jar包的实现

    首先,动态加载jar的核心在于自定义类加载器(ClassLoader)。类加载器是Java虚拟机(JVM)的一部分,负责查找并加载类的字节码到内存中。Java默认提供了几个内置的类加载器,如Bootstrap ClassLoader、Extension ...

Global site tag (gtag.js) - Google Analytics