目录





使用参数进行扩展(推荐,使用-Djava.ext.dirs=jar包目录 进行扩展,这种方 式会覆盖掉原始目录,可以用;(windows):(macos/linux) 追加上原始目录)

主要是加载用户当前应用程序下的类。










系统的ClassLoader只会加载指定目录下的class文件,如果你想加载自己的class文件,那么就可以自定义一个ClassLoader。而且我们可以根据自己的需求,对class文件进行加密和解密。
1.新建一个类继承自java.lang.ClassLoader,重写它的findClass方法。
2.将class字节码数组转换为Class类的实例
3.调用loadClass方法即可
下面的代码就是自定义Class的例子
- package JVM;
-
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
-
- public class MyClassLoader extends ClassLoader {
- //指定路径
- private String path ;
-
- public MyClassLoader(String classPath){
- path=classPath;
- }
-
- /**
- * 重写findClass方法
- * @param name 是我们这个类的全路径
- * @return
- * @throws ClassNotFoundException
- */
- @Override
- protected Class> findClass(String name) throws ClassNotFoundException {
- Class log = null;
- // 获取该class文件字节码数组
- byte[] classData = getData();
- if (classData != null) {
- // 将class的字节码数组转换成Class类的实例
- log = defineClass(name, classData, 0, classData.length);
- }
- return log;
- }
- /**
- * 将class文件转化为字节码数组
- * @return
- */
- private byte[] getData() {
- File file = new File(path);
- if (file.exists()){
- FileInputStream in = null;
- ByteArrayOutputStream out = null;
- try {
- in = new FileInputStream(file);
- out = new ByteArrayOutputStream();
-
- byte[] buffer = new byte[1024];
- int size = 0;
- while ((size = in.read(buffer)) != -1) {
- out.write(buffer, 0, size);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- in.close();
- } catch (IOException e) {
-
- e.printStackTrace();
- }
- }
- return out.toByteArray();
- }else{
- return null;
- }
- }
- }
可以在getData里面做很多事情 ,比如加密解密之类的 都是可以的。
1、我们生成一个.class文件的测试样品
- public class Log {
- public static void main(String[] args) {
- System.out.println("load Log class successfully");
- }
- }
2、我们执行命令行 javac Log.java 生成我们的Log.class文件

3、再main函数入口 写配置参数
- public class ClassLoaderMain {
-
- public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
- //这个类class的路径
- String classPath = "/Users/mac/CommProjects/ClassLoaderDemo/src/com/yhk/classloaderdemo/Log.class";
-
- MyClassLoader myClassLoader = new MyClassLoader(classPath);
- //类的全称
- String packageNamePath = "com.yhk.classloaderdemo.Log";
-
- //加载Log这个class文件
- Class> Log = myClassLoader.loadClass(packageNamePath);
-
- System.out.println("类加载器是:" + Log.getClassLoader());
-
- //利用反射获取main方法
- Method method = Log.getDeclaredMethod("main", String[].class);
- Object object = Log.newInstance();
- String[] arg = {"ad"};
- method.invoke(object, (Object) arg);
- }
-
-
- }










