JVM 二. 类加载相关

2023-11-12

一. 类的加载

  1. 什么是类的加载: 我们编写java代码存储为.java结尾的文件,经过编译器编译,将java代码转换为虚拟机指令生成.class结尾的文件,当需要某个类时,虚拟机加载指定的.calss文件,并创建对应的class对象, 将class文件加载到虚拟机内存的过程称为类的加载,通过ClassLoder 负责将class文件字节码内容加载到内存中,并将这些内容转换成方法区的运行时数据结构,ClassLoder只负责加载,是否可以运行则由 Execution Engine 决定
  2. 总结类加载要完成的事情
  • 通过类的全限定名来获取定义此类的二进制字节流
  • 将这个类字节流代表的静态存储结构转为方法区的运行时数据结构
  • 在堆中生成一个代表此类的java.lang.Class对象,作为访问方法区这些数据结构的入口
  1. 类的加载过程分析: 加载—连接—初始化—使用—卸载
  1. 加载:
    - 系统运行时.类加载器加载class文件,将文件中的二进制数据读取到内存中,Cpu在内存中读取数据和指令进行运算, (由于CPU的处理速度大于调入数据的速度,容易造成数据的脱节,所以需要内存起缓冲作用)
    - 将.class文件读取到内存方法区后,会在堆中创建一个java.lang.Class对象,用来封装类位于方法区内的数据结构,该Class对象是在类的加载过程中创建的,每个类对应一个Class对象,这个Class构造器私有,通过jvm才能创建,是反射的路口,通过该类,通过反射获取需要的目标类的.class文件中的数据
    - 总结: 加载一个类时,jvm会在堆中创建这个类对应的Class对象,通过这个Class对象,利用反射获取到需要加载的类的clss文件
  2. 连接(分为三步,验证,准备,解析)
    - 验证: 确保加载的类符合jvm规范
    - 准备: 在内存的方法区(静态域)中,为类的静态成员分配内存,初始化静态成员(注意只是分配内存初始化,并不赋值,创建类时先加载类的静态资源,静态变量,静态代码块,静态方法,静态类等)
    - 解析: 虚拟机常量池的符号引用替换为直接引用过程
  3. 初始化: 执行目标类的静态内容----构造器,对目标类对象创建的过程(多个静态内容按照代码的先后顺序执行),如果初始化的目标类有父类,会先初始化父类,简而言之主要工作就是:会执行系统提供的一个clinit方法为类的静态成员赋值,
    在这里插入图片描述
  1. 在执行完加载后对应这个类的Class在存在什么位置: 上面我们了解到类的加载过程,当整个对象加载后会有对象引用,对象实例,与对应该类的Class对象,引用存在栈中,对象实例存在堆中,Class也是存在堆中

  2. 数组的加载有什么不同: 数组本身不是由类加载器创建的,而是通过JVM在运行时根据需要直接创建的,但是数组的元素类型仍然需要有类加载器加载完成
    在这里插入图片描述

  3. final类型变量与static类型变量分别在什么时候进行赋值的: final类型变量是在链接阶段进行显示赋值的,除了final类型变量以外其它所有变量例如static是在类加载时初始化步骤执行系统提供的clinit方法赋值的,然后再初始化局部变量属性等,进而又引出一个问题,所有final类型变量都是在链接阶段赋值吗?不是,例如先创建一个static类别变量,然后将该变量值赋值给一个final类型变量,该final类型变量就是在初始化阶段进行实际的赋值

  4. 初始化阶段会执行一个系统提供的clinit方法对类中静态成员进行初始化,那么clinit会有可能造成死锁吗,会,例如创建了A,B两个类,两个类中分别都在静态代码块等待对方先加载完成拿到资源完成自己的初始化,互相等待资源造成死锁

class A {
    static {
        try {
            TimeUnit.SECONDS.sleep(5);
            Class.forName("com.juc.test.B");
        } catch (InterruptedException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class B {
    static {
        try {
            TimeUnit.SECONDS.sleep(5);
            Class.forName("com.juc.test.A");
        } catch (InterruptedException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
  1. 获取 Class 的三种方式,类加载器需要Class去获取
public class T1 {

    public static void main(String[] args) throws ClassNotFoundException {
    	//1.通过类名.class
        Class cla = T1.class;
        //2.通过 Class 调用 forName() 静态方法,输入需要获取 Class 类的全类名
        Class cla2 = Class.forName("全类名");
        //3.通过需要获取 Class 的对象调用 getClass() 方法
        T1 t = new T1();
        Class cla3 = t.getClass();
		
		//通过 Class 获取类加载器
        cla.getClassLoader();
    }
}
  1. 什么时候会触发将一个类加载完毕,注意此处的加载不是指上面加载类时单独加载这一个步骤: 主动使用的情况下
    在这里插入图片描述

  2. Class.forName(“包名.类名”)与Class.getClassLoad().loadClass(“包名.类名”)有什么不同: 一个类的加载步骤分为装载—连接—初始化—使用—卸载五个步骤,使用Class.forName(“包名.类名”)获取一个类的Class,对应加载这个类会执行到初始化步骤,而通过Class.getClassLoad().loadClass(“包名.类名”)方式获取一个类的Class时,对应类的加载步骤只会执行load装载步骤

  3. 加载器的分类: Bootstrap----> Extension—>AppClassLoader

  • Bootstrap 引导类加载器: C++ 语言编写的,主要用来加载jvm自身需要的类
  • Extension 扩展类加载器: java 语言编写的,责加载<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库
  • AppClassLoader 系统类加载器(应用类加载器): 负责加载系统类路径java -classpath或-D java.class.path 指定路径下的类库,也就是我们经常用到的classpath路径,,通过ClassLoader#getSystemClassLoader()方法可以获取到该类加载器
  1. 一个类只能加载一次吗: 一个类只能被同一个类加载器加载一次
  2. 初始化一个类时该类的所有父类都会被初始化吗? 接口除外,初始化一个类或接口时,不会先初始化该类或接口的父接口,只有当程序首次使用特定接口的静态字段时才会导致初始化该接口
  3. 什么情况下类会被卸载: 当一个类被加载,链接,初始化后看为生命周期开始,当该类对应的Class对象不再被引用,变为不可达对象Class对象结束生命周期,该类在方法区中对应的数据也会被卸载,从而整个类的生命周期结束,类的卸载要注意下面几点在这里插入图片描述
  4. 方法区的垃圾回收做了些什么工作
    在这里插入图片描述

二. 类的加载器

  1. 什么是类的加载器: 首先要了解加载一个类的步骤: 加载—>链接—>初始化—>(使用—>卸载),类的加载器是用来加载一个类的,需要注意的是类加载器在加载一个类的步骤中只对应第一步加载阶段,是JVM执行类加载机制的前提
  2. 获取一个类的Class有哪几种方式: 实际可分为显示加载与隐式加载
  1. 类.class,
  2. 对象.getClass(),
  3. Class.forName(“com.Person”),
  4. Class.getClassLoad().loadClass(“包名.类名”),在这里插入图片描述
  1. 类加载器有哪些特征
    在这里插入图片描述
  2. 有哪些类加载器: BootStrap ClassLocader启动类装载器(又叫引导类加载器)—> ExtensionClassLocader扩展类装载器—>ApplicationClassLoader 应用程序类装载器---->还有就是用户自定义类装载器
    在这里插入图片描述
  3. Object是使用Bootstrap 加载器进行加载的,自定义类使用 AppClassLoader 加载器加载,获取自定义类加载器的父加载器返回ExtClassLoader 加载器,不同加载器之间有继承关系, Bootstrap 是所有加载器的父加载器
  4. 获取类加载器示例
public class T1 {
    public static void main(String[] args) {
        //1.获取 Object 对象类加载器
        //Object所有类的父类,使用 JAVA 默认提供的 Bootstrap 加载器加载
        //Bootstrap也就是启动类加载器
        Object obj = new Object();
        //打印为 null说明使用 Bootstrap 加载器加载的
        System.out.println(obj.getClass().getClassLoader());

        //查看自定义类 T1 的类加载器,输出 sun.misc.Launcher$AppClassLoader@18b4aac2
        //自定义类使用 AppClassLoader 加载器加载
        System.out.println(T1.class.getClassLoader());
        //输出 sun.misc.Launcher$ExtClassLoader@63c12fb0
        //ExtClassLoader 加载器
        System.out.println(T1.class.getClassLoader().getParent());
        //null, Bootstrap 加载器
        System.out.println(T1.class.getClassLoader().getParent().getParent());
    }
}

类加载器的双亲委派机制

  1. 双亲委派机制: 使用类加载器加载一个类的过程,类加载器收到类加载请求,并不会自己加载,而是把这个请求委托给父加载器去执行,如果父加载器还存在父加载器,则继续向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父加载器可以完成类加载任务,成功返回,倘若父类加载器无法完成加载任务,向下放行子加载器才会尝试自己去加载,这就是双亲委派模式
  2. 双亲委派的优点: Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次, 考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改,如果我们在classpath路径下自定义一个名为java.lang.SingleInterge类(该类是胡编的)呢?该类并不存在java.lang中,经过双亲委托模式,传递到启动类加载器中,由于加载器路径下并没有该类,所以不会加载,将反向委托给子类加载器加载,最终会通过系统类加载器加载该类。但是这样做是不允许,因为java.lang是核心API包,需要访问权限,强制加载将会报java.lang.SecurityException: Prohibited package name: java.lang
  3. **ClassLoader源码:**加载一个类时实际执行的是ClassLoader下的loadClass()方法,解读下方的源码,先获取父类加载器进行加载,如果父类加载器加载失败使用Bootstrap进行加载,如果Bootstrap还是加载失败则调用findClass()自己加载,这就是双亲委派,并且在自定义类加载器时,重写这个findClass()方法,通过该方法加载即可,不推荐通过重写loadClass()方法的方式实现自定义类加载器,防止破坏双亲委派模型
	//1.加载一个类时执行的方法
	public Class<?> loadClass(String name) throws ClassNotFoundException {
		//调用loadClass,传递的false为是否解析加载的这个类,不解析
        return loadClass(name, false);
    }
    //2.调用的loadClass方法
	protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
            //1.先调用一个findLoadedClass()方法获取这个类的Class
            Class<?> c = findLoadedClass(name);
            //2.判断获取到的Class,判断当前加载的类是否已经加载过
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                	//2.1判断当前类加载器是否存在还存在父类加载器
                    if (parent != null) {
                    	//如果存在父类加载器,通过父类,执行父类加载器的loadClass()方法加载该类
                        c = parent.loadClass(name, false);
                    } else {
                    	//如果不存在父类加载器,通执行findBootstrapClassOrNull()方法通过Bootstrap类加载器进行加载
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
				//3.判断通过上方最终父类加载器,或Bootstrap启动类加载是否成功,如果为null说明不成功
                if (c == null) {
                    //3.1通过自己的类加载器加载
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            //4.是否解析
            if (resolve) {
            	//4.1.执行resolveClass()方法解析该类
                resolveClass(c);
            }
            return c;
        }
    }
  1. 自定义类加载器
    在这里插入图片描述
  1. 继承 ClassLoader
  2. 重写 findClass() 方法
  3. findClass()方法内读取类文件为字节数组
  4. 通过defineClass()将读取到的类文件数组加载为Class
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class UserDefineClassLoader extends ClassLoader {
    //当前自定义类加载器加载的文件类文件路径
    private String rootPath;

    public UserDefineClassLoader(String rootPath) {
        this.rootPath = rootPath;
    }


    //自定义ClassLoader主要方法,通过自定义classLoader
    //可以在加载指定类时进行自定义操作例如加解密,隔离等等
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        //1.获取需要加载的类文件路径
        String filePath = this.rootPath + "\\" + name.replace(".", "\\") + ".class";

        //2.获取指定路径下的class文件二进制流
        byte[] data = this.getBytesFormPath(filePath);

        //3.自定义Classloader内部建议调用defineClass(),将读到的指定的类文件转换为Class
        return defineClass(name, data, 0, data.length);
    }

    private byte[] getBytesFormPath(String filePath) {
        FileInputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
            byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, len);
            }
            return byteArrayOutputStream.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                if (null != inputStream) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (null != byteArrayOutputStream) {
                    byteArrayOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    public static void main(String[] args) throws ClassNotFoundException {
        //注意需要加载的类所在位置必须正确,类.class文件必须存在
        UserDefineClassLoader loader = new UserDefineClassLoader("E:\\work001\\test\\test-redis-parent\\sprngboot-redis-tk\\target\\classes");
        Class classA = loader.findClass("com.juc.test.A");
        System.out.println(classA);

        //演示2, 上面通过new出来的类加载器获取到了classA,
        //现在再new出第二个类加载器去加载第二个同一个类的class
        UserDefineClassLoader loader2 = new UserDefineClassLoader("E:\\work001\\test\\test-redis-parent\\sprngboot-redis-tk\\target\\classes");
        Class classB = loader.findClass("com.juc.test.A");
        //判断classA是否==clssB,返回false,原因new了两个类加载器,使用两个类加载器加载的,进而实现了隔离
        System.out.println(classA == classB);

    }
}
  1. 自定义类加载器的好处
    在这里插入图片描述
  2. 自定义类加载器的应用场景有哪些
    在这里插入图片描述
  3. 破坏双亲委派机制: 双亲委派是在java1.2以后推出的,1.2前没有,还有就是JDBC中,就需要通过Bootstrop引导类加载器拿到AppliactionClassLoader系统类加载器加载的jdbc.jar SPI接口实现类,双亲委派是不允许的,而是通过一个反向委托线程上下文加载器ContextClassLoader反向去加载获取SPI接口实现类,ContextCassLoader就是ApplicationClassLoader,还有热部署也是打破双亲委派的,还有Tomcat的类加载机制为了实现隔离性也是打破双亲委派的每个webappClassLoader加载自己目录下的class文件不会传递给父加载器加载,但是Thocat8中可以通过"< loader delegate=“true” >" 来开启双亲委派
  4. Tomcat打破双亲委派后提出的几个问题
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM 二. 类加载相关 的相关文章

  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

    我创建了一个 RestController 如下所示 RestController public class GreetingController RequestMapping value greetings method RequestM
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • org/codehaus/plexus/archiver/jar/JarArchiver(不支持的major.minor版本49.0)-Maven构建错误

    下午大家 我在尝试构建项目时收到上述错误 我很确定这与使用 Java 1 6 编译的 Maven 最新更新有关 而我们尝试构建的项目是 1 4 项目 在此之前的插件工作没有问题 因此我将以下内容添加到 POM xml 文件中以尝试强制使用现
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • Lombok @Builder 不创建不可变对象?

    在很多网站上 我看到 lombok Builder 可以用来创建不可变的对象 https www baeldung com lombok builder singular https www baeldung com lombok buil
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • 从python入门到机器学习的心得贴(持续更新ing

    仅代表个人看法 大学的编程是C语言入的门 专业上的使用也是C语言为主 非码农 但个人觉得 作为21世纪的新新人类 python的工程的各个领域都有融合的价值 于是抽空就把python入了门 一 入门之路 开始也不知道该从哪儿开始 之后看到一
  • 行列式与矩阵的区别

    1 行列式的本质是线性变换的放大率 而矩阵的本质就是个数表 2 行列式行数 列数 矩阵不一定 行数列数都等于n的叫n阶方阵 二者的表示方式亦有区别 3 行列式与矩阵的运算明显不同 1 相等 只有两个同型的矩阵才有可能相等 并且要求对应元素都
  • PyTorch深度学习——Anaconda和PyTorch安装

    一 Anaconda安装 前言 安装anaconda后主要有一下3点好处 1 包含环境管理器conda 2 大量安装基于python的工具包 3 可以创建使用和管理不同的python版本 附上百度百科的解释 下载步骤 1 官网下载anaco
  • Linux部署Nginx并配置https

    1 下载nginx安装包 wget http nginx org download nginx 1 21 6 tar gz 2 解压压缩包 tar zvxf nginx 1 21 6 tar gz 3 初始化configure 配置conf
  • C语言——猜数字小游戏

    实现一个猜数字的小游戏 gt 首先要用的c语言的随机生成数 在C语言中 我们一般使用
  • import-module的注意事项与NDK_MODULE_PATH的配置

    具体的语句多参考其他正确的Android mk import module的功能 导入外部模块的 mk文件 和 include基本一样 概念上的区别是include导入的是由我们自己写的 mk 而import module导入的是外部库 外
  • C语言中设置文字颜色

    记得刚接触C语言时 上机运行代码输出结果每次都是黑色的控制台白色的文字 就像下面这样 视觉体验极差 十分的不美观 感觉很low 这就引发了我的思考 输出结果必须是黑框白字吗 显然不是这样的 我们可以自己设置文字和文本颜色 那么该如何设置呢
  • VS CODE 离线插件下载

    VS CODE 离线插件下载 老方法 一 进入VSCODE 插件下载官网 二 搜索需要下载的插件 三 进行地址替换 四 下载 五 在windows环境下安装插件 新方法 一 进入VSCODE 插件下载官网 二 搜索需要下载的插件 三 下载
  • 【原創】checkstyle配置文件说明(checkstyle 3.5)

    属性 说明 basedir 代码所在的位置 AbstractClassName format 定义抽象类的命名规则 PackageName format 定义包名的命名规则 TypeName format 定义类和接口的命名规则 token
  • 警惕!MySQL成数据勒索新目标

    据最新报道显示 继MongoDB和Elasticsearch之后 MySQL成为下个数据勒索目标 从2月12日凌晨开始 已有成百上千个开放在公网的MySQL数据库被劫持 删除了数据库中的存储数据 攻击者留下勒索信息 要求支付比特币以赎回数据
  • Kibana常用命令

    Kibana常用命令 查看集群的健康情况 GET cat health v 查看节点的情况 GET cat nodes v 查询各个索引状态 GET cat indices v 创建索引 PUT movie index 查看某一个索引的分片
  • 9月17日星期二 恒指/美原油/美黄金 走势分析

    财经早餐 2019年09月17日星期二 重点关注的财经数据与事件 09 30 中国70个大中城市住宅销售价格月报 09 30 澳洲联储公布9月货币政策会议纪要 17 00 德国及欧元区9月ZEW经济景气指数 21 15 美国8月工业产出月率
  • idea删除模块后重新创建显示该模块已经被注册

    idea删除模块后重新创建显示该模块已经被注册 原因 注册信息没有删除干净 解决方案 找到gradle xml modules xml workspace xml文件 进一步删除模块信息
  • odoo 打开form 视图 默认为编辑状态

    为了编辑方便 客户会经常要求 odoo 打开form 视图 默认为编辑状态 或者根据某些条件 为编辑状态 下面介绍两种方式进行 1 在form 初始化加载时进行拦截 设置属性打开编辑状态 FormView include 满足条件 form
  • springboot的yaml写法之map、list和map<String,List>

    分两步 设置yaml 注入参数 1 设置yaml 文件名 application yml runcommand firstMapList key11 k1 k2 k3 key22 k1 k2 k3 list lk1 lk2 lk3 maps
  • java 编译时注解框架 lombok-ex

    lombok ex lombok ex 是一款类似于 lombok 的编译时注解框架 编译时注 拥有运行时注解的便利性 和无任何损失的性能 主要补充一些 lombok 没有实现 且自己会用到的常见工具 创作目的 补充 lombok 缺失的注
  • nginx输出php错误日志,Nginx错误日志(error_log)配置及信息详解

    Nginx状态信息 status 配置及信息详解 nginx与php fpm一样内建了一个状态页 对于想了解nginx的状态以及监控nginx非常有帮助 为了后续的zabbix监控 我们需要先了解一下nginx的状态页 Nginx状态信息
  • 【Matplotlib】【Python】如何使用matplotlib颜色映射

    颜色映射 colormap 是一系列颜色 它们从起始颜色渐变到结束颜色 在可视化中 颜色映射用于突出数据的规律 例如 你可能用较浅的颜色来显示较小的值 并使用较深的颜色来显示较大的值 模块pyplot内置了一组颜色映射 要使用这些颜色映射
  • 学习UpdatePanel控件-

    原文可以显示图片 转载 http blog csdn net ILOVEMSDN archive 2007 11 11 1879343 aspx UpdatePanel控件的使用 2008 10 07 05 46 P M ScriptMan
  • JVM 二. 类加载相关

    目录 一 类的加载 二 类的加载器 类加载器的双亲委派机制 一 类的加载 什么是类的加载 我们编写java代码存储为 java结尾的文件 经过编译器编译 将java代码转换为虚拟机指令生成 class结尾的文件 当需要某个类时 虚拟机加载指