第一步:自定义一个类加载器
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);
}
}
}
分享到:
相关推荐
接着,Extension ClassLoader加载扩展类库,然后是App ClassLoader加载应用程序的类路径下的类。每个ClassLoader都有其父ClassLoader,它们形成了一个层次结构,子ClassLoader可以委托父ClassLoader去加载类,避免了...
在Java中,每个类都是由一个ClassLoader实例加载的。系统中存在三种基本的ClassLoader: 1. Bootstrap ClassLoader:这是最基础的类加载器,由JVM本身实现,负责加载JRE的`<JAVA_HOME>/lib`目录下的核心类库,或者...
Android Classloader动态加载分析 Android Classloader动态加载分析是Android应用程序中一个非常重要的知识点。ClassLoader是Java虚拟机(JVM)中的一种机制,负责加载Java类文件到内存中,并将其转换为java.lang....
在Java中,动态加载jar包的核心在于使用`java.lang.ClassLoader`类或其子类。ClassLoader是Java虚拟机(JVM)的一部分,负责将类的字节码加载到JVM中并转换为Class对象。默认情况下,JVM会使用系统类加载器来查找和...
Bootstrap ClassLoader负责加载JDK的核心库,Extension ClassLoader加载Java的扩展库,而App ClassLoader则加载应用的类路径下的类。用户还可以自定义类加载器,用于加载特定位置或格式的类。 2. **Java类** Java...
这里的`Class.forName()`方法使用了我们的自定义类加载器来加载类,并创建实例。 标签“Java 动态加载”不仅涵盖了上述的基础知识,还可能涉及更高级的话题,如类加载器的线程安全、双亲委派模型的打破以及如何处理...
比如,如果用户尝试使用Application ClassLoader加载rt.jar中的类,这个请求会被委派到Extension ClassLoader,最终到达Bootstrap ClassLoader,它会首先检查自己是否已经加载了这个类,如果已经加载,那么就不会...
3. 实现类的动态实例化:通过自定义ClassLoader加载的类,可以使用Class.forName()方法获取其Class对象,然后通过newInstance()创建实例。 四、测试与实践 在提供的压缩包中,load.jar和test.jar可能是包含待动态...
4. **加载Apk中的类**:通过自定义ClassLoader实例的loadClass()方法,可以加载Apk中的任何类。 5. **执行Apk中的方法**:一旦类被加载,就可以像普通类一样调用其中的方法。 **动态加载Jar** 加载Jar包的过程与...
总结来说,Java动态加载数据库驱动的核心在于利用 `ClassLoader` 在运行时加载特定的数据库驱动类,避免了因为静态加载所有驱动而可能导致的冲突问题,提高了代码的灵活性和适应性。同时,这种方式还允许在运行时...
动态加载需要创建新的ClassLoader来加载新APK中的.dex文件。通过 DexClassLoader 或其子类,如PathClassLoader,我们可以加载外部存储上的APK并执行其中的代码。 5. **权限处理**: 动态加载的APK需要处理权限问题...
findClass方法是ClassLoader类的核心方法,该方法会尝试加载指定的类,如果加载成功则返回该类的实例,否则抛出ClassNotFoundException。 知识点七:双亲委派模型的优点 双亲委派模型的优点是可以避免类的重复加载...
要实现类的动态加载,开发者可以创建自定义类加载器,继承`java.lang.ClassLoader`类,并重写其`findClass`或`loadClass`方法。动态加载类通常应用于热更新、插件系统等场景,例如Tomcat和WebLogic服务器就是通过...
2. 创建DexClassLoader实例,传入JAR文件路径、基类加载器、优化后的DEX文件路径和临时目录。 ```java File jarPath = new File("/path/to/your.jar"); File optimizedDexPath = context.getDir("optimized", ...
这种委托加载机制保证了类的唯一性,防止了同一个类被不同ClassLoader加载两次的问题。 ClassLoader还有自定义的概念,允许开发者创建自己的ClassLoader来实现特定的加载逻辑。例如,从网络、数据库或特定文件系统...
- 然后,你可以像使用任何其他Java对象一样使用这个动态加载的类的实例。 5. **安全性与隔离** - 动态加载的类可以实现沙箱安全,通过限制类加载器的权限,防止恶意代码执行。 - 不同的类加载器加载的类被视为...
在Android开发中,动态加载...综上所述,“动态加载demo”为我们提供了一个实践动态加载技术的实例,通过学习和理解这个示例,开发者可以更好地掌握如何在Android应用中实现动态加载,以提升应用的灵活性和可维护性。
Android系统在启动Activity时,会通过ClassLoader加载对应的Activity类。如果我们能够自定义ClassLoader,就可以在运行时决定加载哪个Activity类,从而实现动态加载。 首先,我们需要创建一个基础的HostActivity,...
首先,动态加载jar的核心在于自定义类加载器(ClassLoader)。类加载器是Java虚拟机(JVM)的一部分,负责查找并加载类的字节码到内存中。Java默认提供了几个内置的类加载器,如Bootstrap ClassLoader、Extension ...