美文网首页
类加载器,自定义类加载器

类加载器,自定义类加载器

作者: John13 | 来源:发表于2019-05-18 17:20 被阅读0次

参考:
一篇文章读懂Java类加载器
全面解析Java类加载器

类加载器

  • 类加载器结构:

  • ClassLoader类是一个抽象类,但却没有包含任何抽象方法。

  • 如果要实现自己的类加载器且不破坏双亲委派模型,只需要继承ClassLoader类并重写findClass方法。

  • 如果要实现自己的类加载器且破坏双亲委派模型,则需要继承ClassLoader类并重写loadClass,findClass方法。

自定义类加载器

  • 实现自定义类加载器的三步:

1.继承ClassLoader
2.重写findClass()方法
3.调用defineClass()方法

一个基本的自定义类加载器代码如下:

/*
 * John Han.
 * Copyright (c) 2019-2019 All Rights Reserved.
 */
package com.john.learn.basic.class_loader;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

/*
 * 自定义类加载器
 * author: john.
 * version: CustomClassLoader.java, v 0.1 2019年05月18日 下午5:14 Exp.
 */
public class CustomClassLoader extends ClassLoader {

  @Override
  protected Class<?> findClass(String name) throws ClassNotFoundException {
    try {
      byte[] result = getClassFromCustomPath(name);
      if (result == null) {
        throw new FileNotFoundException(name);
      } else {
        // defineClass方法将字节码转化为类
        return defineClass(name, result, 0, result.length);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    throw new ClassNotFoundException(name);
  }

  private byte[] getClassFromCustomPath(String name) {
    // 从自定义路径中加载指定类,返回类的字节码文件
    InputStream in = null;
    ByteArrayOutputStream out = null;
    String path = "/Users/john/" + name + ".class";
    try {
      in = new FileInputStream(path);
      out = new ByteArrayOutputStream();
      byte[] buffer = new byte[2048];
      int len = 0;
      while ((len = in.read(buffer)) != -1) {
        out.write(buffer, 0, len);
      }
      return out.toByteArray();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        in.close();
        out.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return null;
  }

  public static void main(String[] args) {
    CustomClassLoader customClassLoader = new CustomClassLoader();
    try {
      Class<?> clazz = Class.forName("One", true, customClassLoader);
      Object obj = clazz.newInstance();
      // cn.xpleaf.coding.c4.CustomClassLoader@610455d6
      System.out.println(obj.getClass().getClassLoader());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

相关文章

  • java 类加载器

    自定义类加载器 自定义类加载器运行

  • 类加载阅读目录

    什么是类加载器 类加载器与类的”相同“判断 类加载器种类 双亲委派模型 类加载过程 自定义类加载器 JAVA热部署...

  • JVM(四)-类加载器

    类加载器大的分类分为两类(JAVA虚拟机规范):引导类加载器、自定义类加载器 引导类加载器(启动类加载器) Boo...

  • 深入理解Java类加载器

    本文主要内容 类加载器基本概念 自定义类加载器 类的隔离 Android类加载器案例 虚拟机类加载机制 文中已经对...

  • 近期面试java基础部分面试题

    java部分: 常见的加载器有哪些,如何自定义一个加载器? 类加载器:启动类加载器(bootstrap class...

  • java类加载机制、类加载器、自定义类加载器

    java类加载机制、类加载器、自定义类加载器 类加载机制 java类从被加载到JVM到卸载出JVM,整个生命周期包...

  • JAVA微服务技术栈相关 知识点梳理

    JVM jvm作为底层支撑,需要了解的有: 其中重点为类加载器与内存模型。类加载器中,主要自定义类加载器,加载自定...

  • java类加载器及其原理

    java类加载器 : java中默认有三种类加载器:引导类加载器,扩展类加载器,系统类加载器(也叫应用类加载器) ...

  • 自定义类加载器

    1、为什么需要自定义类加载器 在《类加载器》中讲的,默认类加载器只能加载固定路径下的class,如果有特定路径下的...

  • 类加载器双亲委托机制

    自定义类加载器 MyTest18 本例中,2个类加载器,都委托系统(或应用)加载器去加载,因此重写的findCla...

网友评论

      本文标题:类加载器,自定义类加载器

      本文链接:https://www.haomeiwen.com/subject/jvitzqtx.html