java 类加载器

java中jol-core依赖分析对象内存模型 阅读详情

开发过程中经常会遇到java.lang.ClassNotFoundExcetpion的异常,为何会有这个异常呢?因为你想要使用的类并未加载到虚拟机当中。本文将介绍java的类加载器,让你了解一个class文件加载到虚拟机中的机制,并介绍了如何自定义类加载器。结合代码验证理论。

JVM预定义的三种类加载器

JVM预定义了三种类加载器,分别是:

  • 启动类加载器(BootStrap)
  • 扩展类加载器(Extension)
  • 系统类加载器(System)

启动类加载器

启动类加载器是使用本地代码实现的,类似于我们看源码时的native方法,找不到具体的class。它负载将JAVA_HOME/lib下的核心类库或-Xbootclasspath选项指定的路径下的jar加载到虚拟机当中。

System.getProperty(“sun.boot.class.path”)参数可以查看该类加载器加载的路径。

因为没有具体的class,所以没法看类图。

扩展类加载器

扩展类加载器是sun.misc.Launcher$ExtClassLoader。它负责将JAVA_HOME /lib/ext或者由系统变量-Djava.ext.dir指定位置中的类库加载到内存中。

System.getProperty(“java.ext.dirs”)参数可以查看该类加载器加载的路径。

类图如下:
在这里插入图片描述
它是sun.misc.Launcher的内部类。

系统类加载器

系统类加载器是sun.misc.Launcher$AppClassLoader。它负责将用户类路径(java -classpath或-Djava.class.path变量所指的目录,即当前类所在路径及其引用的第三方类库的路径下的类库加载到内存中。开发者可以直接使用系统类加载器。

System.getProperty(“java.class.path”)可查看该类加载器加载的路径。

类图如下:
在这里插入图片描述
与扩展类加载器一样,它也是sun.misc.Launcher的内部类。

三种类加载的文件路径测试代码

下面的代码分别打印了三种类加载器加载了哪些路径的jar包,验证上面的介绍

package ClassLoader;

/**
 * @author ludengke
 * @title: ClassLoader.TestClassLoader
 * @projectName springcloud-demo
 * @description: TODO
 * @date 2021/12/2615:15
 */
public class TestClassLoader {

    public static void main(String[] args) {
        bootStrapClassLoader();
        extClassLoader();
        appClassLoader();
//        testClassLoader();
    }

    /**
     * 测试TestBean被哪个类加载器加载的,这个加载器加载的路径是啥
     */
//    private static void testClassLoader(){
//        try {
//            //查看当前系统类路径中包含的路径条目
//            System.out.println(System.getProperty("java.class.path"));
//            //调用加载当前类的类加载器(这里即为系统类加载器)加载TestBean
//            Class typeLoaded = Class.forName("sun.net.spi.nameservice.dns.DNSNameService");
//            Class typeLoaded2 = Class.forName("ClassLoader.TestBean");
//            //查看被加载的TestBean类型是被那个类加载器加载的
//            System.out.println(typeLoaded.getClassLoader());
//            System.out.println(typeLoaded2.getClassLoader());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
    /***
    *@Description 测试bootstrap加载的路径
    *@Param []
    *@Return void
    *@Author ludengke
    *@Date 2021/12/26
    *@Time 15:17
    */
    private static void bootStrapClassLoader(){
        System.out.println("bootstrap start:");
        System.out.println(System.getProperty("sun.boot.class.path"));
        System.out.println("bootstrap end:");

    }
    /***
    *@Description extClassLoader加载的路径
    *@Param []
    *@Return void
    *@Author ludengke
    *@Date 2021/12/26
    *@Time 15:26
    */
    private static void extClassLoader(){
        //testClassLoaderParent();
        System.out.println("ext start");
        System.out.println(System.getProperty("java.ext.dirs"));
        System.out.println("ext end");

    }

    /**
     * 获取类加载器的parent
     */
    private static void testClassLoaderParent(){
        System.out.println(ClassLoader.getSystemClassLoader());
        System.out.println(ClassLoader.getSystemClassLoader().getParent());
        System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());
    }
    /**
    *@Description appClassLoader加载的路径
    *@Param []
    *@Return void
    *@Author ludengke
    *@Date 2021/12/26
    *@Time 15:29
    */
    private static void appClassLoader(){
        System.out.println("app start");
        System.out.println(System.getProperty("java.class.path"));
        System.out.println("app end");

    }
}

测试类执行结果如下:

D:\work\java\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54689:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\work\java\jre\lib\charsets.jar;D:\work\java\jre\lib\deploy.jar;D:\work\java\jre\lib\ext\access-bridge-64.jar;D:\work\java\jre\lib\ext\cldrdata.jar;D:\work\java\jre\lib\ext\dnsns.jar;D:\work\java\jre\lib\ext\jaccess.jar;D:\work\java\jre\lib\ext\jfxrt.jar;D:\work\java\jre\lib\ext\localedata.jar;D:\work\java\jre\lib\ext\nashorn.jar;D:\work\java\jre\lib\ext\sunec.jar;D:\work\java\jre\lib\ext\sunjce_provider.jar;D:\work\java\jre\lib\ext\sunmscapi.jar;D:\work\java\jre\lib\ext\sunpkcs11.jar;D:\work\java\jre\lib\ext\zipfs.jar;D:\work\java\jre\lib\javaws.jar;D:\work\java\jre\lib\jce.jar;D:\work\java\jre\lib\jfr.jar;D:\work\java\jre\lib\jfxswt.jar;D:\work\java\jre\lib\jsse.jar;D:\work\java\jre\lib\management-agent.jar;D:\work\java\jre\lib\plugin.jar;D:\work\java\jre\lib\resources.jar;D:\work\java\jre\lib\rt.jar;D:\work\springcloud-demo\study\target\classes;D:\work\maven\mavenstore\org\openjdk\jol\jol-core\0.9\jol-core-0.9.jar ClassLoader.TestClassLoader
bootstrap start:
D:\work\java\jre\lib\resources.jar;D:\work\java\jre\lib\rt.jar;D:\work\java\jre\lib\sunrsasign.jar;D:\work\java\jre\lib\jsse.jar;D:\work\java\jre\lib\jce.jar;D:\work\java\jre\lib\charsets.jar;D:\work\java\jre\lib\jfr.jar;D:\work\java\jre\classes
bootstrap end:
ext start
D:\work\java\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
ext end
app start
D:\work\java\jre\lib\charsets.jar;D:\work\java\jre\lib\deploy.jar;D:\work\java\jre\lib\ext\access-bridge-64.jar;D:\work\java\jre\lib\ext\cldrdata.jar;D:\work\java\jre\lib\ext\dnsns.jar;D:\work\java\jre\lib\ext\jaccess.jar;D:\work\java\jre\lib\ext\jfxrt.jar;D:\work\java\jre\lib\ext\localedata.jar;D:\work\java\jre\lib\ext\nashorn.jar;D:\work\java\jre\lib\ext\sunec.jar;D:\work\java\jre\lib\ext\sunjce_provider.jar;D:\work\java\jre\lib\ext\sunmscapi.jar;D:\work\java\jre\lib\ext\sunpkcs11.jar;D:\work\java\jre\lib\ext\zipfs.jar;D:\work\java\jre\lib\javaws.jar;D:\work\java\jre\lib\jce.jar;D:\work\java\jre\lib\jfr.jar;D:\work\java\jre\lib\jfxswt.jar;D:\work\java\jre\lib\jsse.jar;D:\work\java\jre\lib\management-agent.jar;D:\work\java\jre\lib\plugin.jar;D:\work\java\jre\lib\resources.jar;D:\work\java\jre\lib\rt.jar;D:\work\springcloud-demo\study\target\classes;D:\work\maven\mavenstore\org\openjdk\jol\jol-core\0.9\jol-core-0.9.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar
app end

Process finished with exit code 0

从测试结果可以看出系统类加载器也加载了启动类加载器、扩展类加载应该加载的路径,这会不会有问题呢?
应该不会,下面介绍类加载机制。

类加载机制(双亲委派机制)

类加载器的继承关系如下,这里的继承关系不是真正的继承,是类加载器的父子委托关系
在这里插入图片描述
双亲委派机制:

  • 当类加载器接收到加载某个类的请求时,先看看该类加载器是否加载过此类,若加载过则不需要加载,直接使用,若未加载过此类,则委托给父类加载器加载。
  • 以此类推,直至BootStrapClassLoader。
  • 若BootStrapClassLoader加载不到该类,则委托给它的子类加载器ExtClassLoader加载。
  • 以此类推,直至最底层的类加载器。
  • 若都加载不到,那就是找不到该类的错误了。
    在这里插入图片描述
    双亲委派机制的作用:
    为什么这么设计呢?
    从这个加载机制可以看出顶层的类加载器优先级高很多,会覆盖掉底层类加载器加载的类。
    委托给父类加载器时,若父类已经加载该类,则直接用,不需要再重新加载,且保证不覆盖父类加载器加载的内容,保证数据安全。
    上层的类加载器实在加载不到,不能憋着,只能儿孙们自己动手加载。不然底层加载器没有了。
    总结起来一句话:孩子们很懒,已经加载过该类则直接用,否则找长辈们要。如果长辈们也没有,孩子们才自己动手加载。
  • 防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
  • 保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。

测试类加载机制

  • 测试代码如下
    随便写一个类TestBean

package ClassLoader;

public class TestBean {
    public TestBean() {
    }
}

测试类,主要看testClassLoader()方法

package ClassLoader;

/**
 * @author ludengke
 * @title: ClassLoader.TestClassLoader
 * @projectName springcloud-demo
 * @description: TODO
 * @date 2021/12/2615:15
 */
public class TestClassLoader {

    public static void main(String[] args) {
//        bootStrapClassLoader();
//        extClassLoader();
//        appClassLoader();
        testClassLoader();
    }

    /**
     * 测试TestBean被哪个类加载器加载的,这个加载器加载的路径是啥
     */
    private static void testClassLoader(){
        try {
            //查看当前系统类路径中包含的路径条目
//            System.out.println(System.getProperty("java.class.path"));
            //调用加载当前类的类加载器(这里即为系统类加载器)加载TestBean
            Class typeLoaded = Class.forName("sun.net.spi.nameservice.dns.DNSNameService");
            Class typeLoaded2 = Class.forName("ClassLoader.TestBean");
            //查看被加载的TestBean类型是被那个类加载器加载的
            System.out.println(typeLoaded.getClassLoader());
            System.out.println(typeLoaded2.getClassLoader());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /***
    *@Description 测试bootstrap加载的路径
    *@Param []
    *@Return void
    *@Author ludengke
    *@Date 2021/12/26
    *@Time 15:17
    */
    private static void bootStrapClassLoader(){
        System.out.println("bootstrap start:");
        System.out.println(System.getProperty("sun.boot.class.path"));
        System.out.println("bootstrap end:");

    }
    /***
    *@Description extClassLoader加载的路径
    *@Param []
    *@Return void
    *@Author ludengke
    *@Date 2021/12/26
    *@Time 15:26
    */
    private static void extClassLoader(){
//        testClassLoaderParent();
        System.out.println("ext start");
        System.out.println(System.getProperty("java.ext.dirs"));
        System.out.println("ext end");

    }

    /**
     * 获取类加载器的parent
     */
    private static void testClassLoaderParent(){
        System.out.println(ClassLoader.getSystemClassLoader());
        System.out.println(ClassLoader.getSystemClassLoader().getParent());
        System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());
    }
    /**
    *@Description appClassLoader加载的路径
    *@Param []
    *@Return void
    *@Author ludengke
    *@Date 2021/12/26
    *@Time 15:29
    */
    private static void appClassLoader(){
        System.out.println("app start");
        System.out.println(System.getProperty("java.class.path"));
        System.out.println("app end");

    }
}

  • 运行测试类
sun.misc.Launcher$ExtClassLoader@7f31245a
sun.misc.Launcher$AppClassLoader@18b4aac2

Process finished with exit code 0
  • sun.net.spi.nameservice.dns.DNSNameService这个类是扩展类加载器加载的路径中的类,暂时不看。主要看ClassLoader.TestBean,该类是用AppClassLoader加载的,加载的是上面写的那个类。
  • 将ClassLoader.TestBean类生成testjar.jar,将该jar包拷贝到JAVA_HOME\jre\lib\ext下,再次运行,结果如下。可以看出ClassLoader.TestBean类是ExtClassLoader类加载器加载的,加载的是JAVA_HOME\jre\lib\ext下testjar的内容。可以验证双亲委派机制。
D:\work\java\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=62498:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\work\java\jre\lib\charsets.jar;D:\work\java\jre\lib\deploy.jar;D:\work\java\jre\lib\ext\access-bridge-64.jar;D:\work\java\jre\lib\ext\cldrdata.jar;D:\work\java\jre\lib\ext\dnsns.jar;D:\work\java\jre\lib\ext\jaccess.jar;D:\work\java\jre\lib\ext\jfxrt.jar;D:\work\java\jre\lib\ext\localedata.jar;D:\work\java\jre\lib\ext\nashorn.jar;D:\work\java\jre\lib\ext\sunec.jar;D:\work\java\jre\lib\ext\sunjce_provider.jar;D:\work\java\jre\lib\ext\sunmscapi.jar;D:\work\java\jre\lib\ext\sunpkcs11.jar;D:\work\java\jre\lib\ext\zipfs.jar;D:\work\java\jre\lib\javaws.jar;D:\work\java\jre\lib\jce.jar;D:\work\java\jre\lib\jfr.jar;D:\work\java\jre\lib\jfxswt.jar;D:\work\java\jre\lib\jsse.jar;D:\work\java\jre\lib\management-agent.jar;D:\work\java\jre\lib\plugin.jar;D:\work\java\jre\lib\resources.jar;D:\work\java\jre\lib\rt.jar;D:\work\springcloud-demo\study\target\classes;D:\work\maven\mavenstore\org\openjdk\jol\jol-core\0.9\jol-core-0.9.jar ClassLoader.TestClassLoader
sun.misc.Launcher$ExtClassLoader@7f31245a
sun.misc.Launcher$ExtClassLoader@7f31245a

Process finished with exit code 0

  • 将testjar.jar拷贝到JAVA_HOME/lib 下,再次运行测试类,结果如下。按理来说启动类加载器应该加载testjar.jar中的ClassLoader.TestBean,可是没有。为啥呢?你什么都往里面写,jdk就不安全了,所以他不认识的东西不加载,保证了安全。
D:\work\java\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=62680:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\work\java\jre\lib\charsets.jar;D:\work\java\jre\lib\deploy.jar;D:\work\java\jre\lib\ext\access-bridge-64.jar;D:\work\java\jre\lib\ext\cldrdata.jar;D:\work\java\jre\lib\ext\dnsns.jar;D:\work\java\jre\lib\ext\jaccess.jar;D:\work\java\jre\lib\ext\jfxrt.jar;D:\work\java\jre\lib\ext\localedata.jar;D:\work\java\jre\lib\ext\nashorn.jar;D:\work\java\jre\lib\ext\sunec.jar;D:\work\java\jre\lib\ext\sunjce_provider.jar;D:\work\java\jre\lib\ext\sunmscapi.jar;D:\work\java\jre\lib\ext\sunpkcs11.jar;D:\work\java\jre\lib\ext\zipfs.jar;D:\work\java\jre\lib\javaws.jar;D:\work\java\jre\lib\jce.jar;D:\work\java\jre\lib\jfr.jar;D:\work\java\jre\lib\jfxswt.jar;D:\work\java\jre\lib\jsse.jar;D:\work\java\jre\lib\management-agent.jar;D:\work\java\jre\lib\plugin.jar;D:\work\java\jre\lib\resources.jar;D:\work\java\jre\lib\rt.jar;D:\work\springcloud-demo\study\target\classes;D:\work\maven\mavenstore\org\openjdk\jol\jol-core\0.9\jol-core-0.9.jar ClassLoader.TestClassLoader
sun.misc.Launcher$ExtClassLoader@7f31245a
sun.misc.Launcher$ExtClassLoader@7f31245a

Process finished with exit code 0

自定义类加载器

为什么需要自定义类加载器呢?
因为系统的ClassLoader只会加载指定目录下的class文件,如果你想加载自己的class文件,那么就可以自定义一个ClassLoader。
而且可以使用加密的class文件,加载该class文件时,只有懂得如何解密才能使用,这时也需要自定义的类加载器。

而且我们可以根据自己的需求,对class文件进行加密和解密。

  • 编写被加载的类,里面随便写个方法,代码如下:

package ClassLoader;

public class TestBean {
    public TestBean() {

    }
    public void testMethod(){
        System.out.println("ClassLoader.TestBean.testMethod()");
    }
}

  • 编写自定义的类加载器MyClassLoader,继承java.lang.ClassLoader,重写findClass方法,代码如下:
package ClassLoader;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author ludengke
 * @title: MyCloassLoader
 * @projectName springcloud-demo
 * @description: TODO
 * @date 2022/1/522:41
 */
public class MyCloassLoader extends ClassLoader {
    private String path;

    public MyCloassLoader(String path) {
        this.path = path;
    }

    /**
     * 重父类的该方法
     *
     * @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;
        }
    }

}

  • 编写测试类,代码如下:
package ClassLoader;

import java.lang.reflect.Method;

/**
 * @author ludengke
 * @title: ClassLoader.TestClassLoader
 * @projectName springcloud-demo
 * @description: TODO
 * @date 2021/12/2615:15
 */
public class TestClassLoader {

    public static void main(String[] args) {
        testMyClassLoader();
    }

    /**
     * 测试自定义的类加载器
     */
    private static void testMyClassLoader(){
        try {
            //实例类加载器
            MyCloassLoader cloassLoader=new MyCloassLoader("D:\\work\\springcloud-demo\\study\\target\\classes\\ClassLoader\\TestBean.class");
            System.out.println("自定义的类加载器的父类加载器是:"+cloassLoader.getParent());
            //通过自定义的类加载器加载类
            Class testBeanClass=cloassLoader.findClass("ClassLoader.TestBean");
            //加载出来的类的类加载器
            System.out.println("类加载器是:" + testBeanClass.getClassLoader());
            //通过反射调用类的方法
            Method method = testBeanClass.getDeclaredMethod("testMethod");
            Object object = testBeanClass.newInstance();
            //调用类的方法
            method.invoke(object);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
}

  • 运行测试类,结果如下:
D:\work\java\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=63921:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\work\java\jre\lib\charsets.jar;D:\work\java\jre\lib\deploy.jar;D:\work\java\jre\lib\ext\access-bridge-64.jar;D:\work\java\jre\lib\ext\cldrdata.jar;D:\work\java\jre\lib\ext\dnsns.jar;D:\work\java\jre\lib\ext\jaccess.jar;D:\work\java\jre\lib\ext\jfxrt.jar;D:\work\java\jre\lib\ext\localedata.jar;D:\work\java\jre\lib\ext\nashorn.jar;D:\work\java\jre\lib\ext\sunec.jar;D:\work\java\jre\lib\ext\sunjce_provider.jar;D:\work\java\jre\lib\ext\sunmscapi.jar;D:\work\java\jre\lib\ext\sunpkcs11.jar;D:\work\java\jre\lib\ext\zipfs.jar;D:\work\java\jre\lib\javaws.jar;D:\work\java\jre\lib\jce.jar;D:\work\java\jre\lib\jfr.jar;D:\work\java\jre\lib\jfxswt.jar;D:\work\java\jre\lib\jsse.jar;D:\work\java\jre\lib\management-agent.jar;D:\work\java\jre\lib\plugin.jar;D:\work\java\jre\lib\resources.jar;D:\work\java\jre\lib\rt.jar;D:\work\springcloud-demo\study\target\classes;D:\work\maven\mavenstore\org\openjdk\jol\jol-core\0.9\jol-core-0.9.jar ClassLoader.TestClassLoader
自定义的类加载器的父类加载器是:sun.misc.Launcher$AppClassLoader@18b4aac2
类加载器是:ClassLoader.MyCloassLoader@1540e19d
ClassLoader.TestBean.testMethod()

Process finished with exit code 0

  • 分析:

1、自定义的类加载器需要继承java.lang.ClassLoader,重写findClass方法。
2、findClass方法的内容是加载指定路径下的class文件,将其转为字节数组,调用父类的defineClass方法将字节数组转为Class对象。
3、通过测试类可以看出,自定义类加载器的父类加载器是sun.misc.Launcher$AppClassLoader。
4、通过测试结果可以看出,自定义类加载器成功加载指定路径下的class文件,设计成功。

参考博客
https://www.jianshu.com/p/1e4011617650
https://blog.youkuaiyun.com/huazai30000/article/details/85296671

jol-core-0.10.jar 对jol-core-0.10.jar进行拓展,打印二进制头信息Mark Word 用法: ClassLayout.parseInstance(对象).toPrintableSimple(true) toPrintableSimple():true 表示二进值,false 表示 十六进制 立即下载

相关推荐

JOGL所有的jar包

ogl是Java OpenGL的简称,想真正的了解它,就需要了解OpenGL,OpenGL是Open Graphics Library,它是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库,请参考http://baike.baidu.com/view/9222.htm,他其实是一个命令的的集合,300多条,算不上编程语言,他最难的在于计算机图形学的知识,而jogl是用java通过jni调用,对openGL的一个封装,所以速度上并不比c慢多少,并且加上java特有的面向对象的特性,来开发游戏比直接用c有过之而无不及!

java使用jol打印对象信息

maven: gradle: 2、测试 运行结果: 3、对象结构说明 对象的结构包括:对象头、对象体、对齐字节对象头包含三部分,Mark Word、Klass Word、数组长度。如果对象不是数组,数组长度可以忽略。以下是 Java对象处于5种不同状态时,Mark Word中 64位的表现形式,上面每一行代表对象处于某种状态时的样子。其中各部分的含义如下: 1、lock。2位,锁状态的标记位, 2、biased_lock。1位。对象是否存在偏向锁标记。lock与biased_lock共同表示锁对象处于什

文若书生的专栏 1808

JOL(JAVA OBJECT LAYOUT)工具0.9.zip

查看java对象内部构造

java通过jol-core库分析对象内存分布以及查看Synchronized锁升级过程

jol-core查看对象内存结构,利用内存结构我们可以清楚看到同步锁Synchronized升级过程。

feinifi的博客 2815

【数据挖掘】心跳信号分类预测 之 特征工程 —— 学习笔记(三)

三、特征工程 3.1 看书 常言道,“巧妇难为无米之炊”。在 ML 中,数据和特征将作“米”,模型和算法则为“妇”。若无数量充足的数据、良好表示的特征,再强大的模型也难以得到满意的结果 (garbage in,garbage out)。对于 ML 问题,数据和特征往往决定了结果的上限,而模型、算法的选择及优化则是在逐步接近该上限。 特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。在本质上,特征工程是一个表示和展现数据的过程。在实际中,特征工程旨在去除...

闻韶 3358

ABAP BOM展开避坑指南:CS_BOM_EXPL_MAT_V2函数参数配置详解

本文深入解析了SAP ABAP开发中用于物料清单展开的核心函数CS_BOM_EXPL_MAT_V2。针对其复杂的参数配置,如CAPID、STLAN、DATUV和MEHRS,提供了详细的避坑指南和最佳实践,帮助开发者避免数据错误与性能陷阱,实现高效、准确的BOM多层展开。

pea55的博客 852

深入理解JVM干货教学 - 【Java对象结构】

快速理解对象核心本质信息,理解Java 底层原理

jjc120074203的博客 975

Trae IDE与Playwright MCP:5分钟实现零代码网页数据抓取

网页数据抓取是数据采集和自动化处理中的基础技术,其核心原理是通过程序模拟浏览器行为,定位并提取页面中的结构化信息。传统方式依赖编写脚本处理网络请求、解析HTML和应对反爬机制,技术门槛较高。而结合AI与自动化工具的新范式,通过自然语言交互即可完成复杂操作,极大降低了技术门槛并提升了开发效率。这种技术价值在于将开发者从繁琐的编码中解放,使其更专注于数据分析和业务逻辑。在数据监控、市场调研、竞品分析等应用场景中,快速获取网页数据是关键需求。本文以Trae IDE集成Playwright MCP为例,演示如何通过

culi3118的博客 498

Java_类加载器

对Java类加载器的讲解分析,包含程序段

AI+全栈,AI+应用,实操落地,前沿技术 2258

Unity 佳能SDK 及数据获取

3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中。1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你。2. 将SDK这两个文件放到 Unity Plugins文件夹。

我知道你很急,但是路要一步步走 1475

滚雪球学Java(01):Java是什么?| 入门指南

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

**My Coding Family** 626

【Java 基础篇】Java类加载器详解

Java允许开发人员自定义类加载器,以满足特定的加载需求。自定义类加载器必须继承类,并重写findClass方法。在findClass方法中,开发人员可以根据自己的规则和逻辑来加载类的字节码。// 根据名称加载类的字节码 byte [ ] byteCode = loadClassByteCode(name);// 调用defineClass方法将字节码转换为Class对象 return defineClass(name , byteCode , 0 , byteCode . length);

繁依Fanyi的博客 1万+

C语言试题四之计算并输出3到n之间所有素数的平方根之和

1、题目 请编写函数function,它的功能是:计算并输出3到n之间所有素数的平方根之和 例子:若我们main函数从键盘给n输入5之后,我们需要输出结果为3.968119 输入值n的要求:正整数n, 要求小于100。 2、部分函数说明 C 库函数 double sqrt(double x) 返回 x 的平方根 3、源代码实现 #include <stdio.h> #...

码莎拉蒂 7232

Java的类加载器有哪些

职责:满足特定需求的类加载器,通常在应用程序中自定义实现。实现:继承java.lang.ClassLoader并重写findClass方法。加载路径:由开发者自行定义,可以是文件系统、网络、数据库等。父类加载器:可以指定,也可以继承应用程序类加载器。@Overridetry {// 将类名转换为文件路径// 读取类文件的字节码// 将字节码转换为 Class 对象当内置的三大类加载器无法满足需求时,就需要自定义类加载器。目的加载非 ClassPath 路径的类。

埃泽漫笔 1092

实战:RK3568 Android14 调试 ES8388 音频驱动 (MIC 篇)

这个板子的MIC设计使用了硬件自动切换方案,极大简化了软件层面的逻辑。我们不需要根据耳机插拔事件去编写复杂的路由切换代码,只需要守住 LIN1/RIN1 这一个入口,配置好增益,剩下的交给那颗 SGM3157 芯片即可。祝您的录音功能调试顺利!

qq_33427070的博客 1677

Windows2008使用-解决漏洞-CVE-2010-2730

随着硬件的升级,操作系统也逐渐进行了版本更新。目前阶段,Windows2016Server、Windows2022Server逐渐成为了以Windows系列的服务器平台系统。对于有些应用而言,由于其业务的固定,可能仍只能运行在Windows2008Server或者Windows2012Server上。有时候我们为安全需要,需要将相关的操作系统涉及的漏洞做修复。最近碰到在一个Windows2008R2 的操作系统漏洞CVE-2010-2730,一顿操作,终于找到了合适的方案,这里分享给大家。

mystonelxj的博客 2313

Java中有哪些类加载器

在 Java 中,类加载器(ClassLoader)负责将类的字节码加载到 JVM 中,并生成对应的。

完全体 868

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 类加载器

类加载器可以说是Java语言的一项创新,让应用程序自己决定如何去获取所需的类的二进制字节流。

Happy博客 1065

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java类加载器有哪些

用户自定义类加载器(User-Defined ClassLoader),ClassLoader子类。用户自定义类加载器实现:开发人员通过继承抽象类java.lang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊需求。不建议覆盖loadClass()方法,而是建议把自定义的类加载逻辑写在findCalss()方法中。

booker009的博客 674

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java中默认的类加载器

java中的类加载器类型以及工作原理。     java中默认的有三种类型加载器。分别是:系统类加载器(应用类加载器)、扩展类加载器、引导类加载器。     上篇博客的例子已经测试了加载器类型是: sun.misc.Launcher$AppClassLoader@f4f44a,这个是系统类加载器。来看一下父类的加载器类型: //测试类加载器 System.out.println("f

2712

java类加载器是什么?

类加载器是有了解吗? 解析:底层原理的考察,其中涉及到类加载器的概念,功能以及一些底层的实现。 答:顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。 类加载器负责读取 Java ...

南 墙 1万+

【Java】类加载器

当一个类被使用的时候,才会加载到内存类加载的过程: 加载、验证、准备、解析、初始化这个需要回忆一下我们刚刚学习的三种类加载器。其中用的最多的就是系统类加载器,如果有必要,我们还可以加入自定义类加载器类加载器的双亲委派模型,在这个模型中,除了顶层的启动类加载器之外,其他的加载器都应该有自己的父类加载器。例如自定义类加载器的父类就是系统类加载器系统类加载器的父类就是平台类加载器平台类加载器的父类就是启动类加载器,由于启动类加载器是最顶层的,所以它上面就没有父类加载器了。

qq_39921135的博客 1067

Java类加载器及Android类加载器基础

引子Android插件化与热更新技术日渐成熟,当你研究这些技术时会发现类加载器在其中占据重要地位。Java语言天生就有灵活性、动态性,支持运行期间动态组装程序,而这一切的基础就是类加载器。Java中的类加载器Java灵活性和动态性的原因Java源代码被编译器编译成字节码,即从.java文件编译为.class文件,而.class文件就是通过类加载器加载到虚拟机内存中的。虚拟机的类加载(Class Lo

Battling against our own ignorance 3035

java类加载器

类加载是一个双亲委派的过程,当类加载器加载一个类的时候,首先会将这个请求委托给父类去完成,每一个层次类加载器都是如此,当父类加载器无法加载的时候,子类加载器才会尝试自己去加载。:Java中的类加载器可以创建不同的类加载器实例,每个实例都有自己的命名空间。:Java类加载器可以实现对加载类的安全性和权限控制,例如可以通过自定义类加载器来限制某些类只能在特定的安全环境中加载。:开发者可以根据需要继承java.lang.ClassLoader类,实现自定义的类加载器,用于特定的加载需求。

lqq1667821818的博客 2125

java基础类加载器_JAVA基础_类加载器

什么是类加载器类加载器是Java语言在1.0版本就引入的。最初是为了满足JavaApplet需要。现在类加载器在Web容器和OSGI中得到了广泛的应用,一般来说,Java应用的开发人员不需要直接同类加载器进行交互。Java虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时候在ClassNotFound...

weixin_33978578的博客 82
上一篇: idea 导出某个类的jar
下一篇: ThreadLocal详解
ludkjava
博客等级 码龄11年 173粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值