JAVA静默加载Class
来源:互联网 发布:软件配置管理人员职责 编辑:程序博客网 时间:2024/04/30 13:45
有时候在开发的时候,我们有这样的场景,我们只想得到一个Class的基本信息,但是并不想触发相关的静态代码块,在之前的一篇《JAVA扫描包》博文中就用到了这种方式,我将其称之为静默加载,如果有专业的叫法,欢迎指正。
一般情况下,我们加载一个Class的时候会使用Class.forName(String name)
方法,该方法会返回一个Class对象,同时会触发该类中的静态代码块,举个例子:
我们先来编写一个只包含静态代码块的Bean
类。
package com.jinggujin.classloader;public class Bean{ static { System.err.println("static code block."); }}
使用err流是为了让信息及时输出,使用out会有缓存,可能会导致输出信息顺序错乱
然后编写测试方法进行测试。
package test;import org.junit.Test;public class ClassLoaderTest{ @Test public void test() throws Exception { Class.forName("com.jinggujin.classloader.Bean"); }}
运行观察控制台输出:
static code block.
此时控制台会输出我们在静态代码块中打印的内容,这样就证明了了在使用Class.forName(String name)
会触发静态代码块,那么,要实现静默加载,我们就不能用这种方式了,我们可以使用ClassLoader
的loadClass(String name)
方法进行加载,该方法仅会加载类而不会触发静态代码块,同样的编写测试方法进行测试。
package test;import org.junit.Test;public class ClassLoaderTest{ @Test public void test() throws Exception { Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass("com.jinggujin.classloader.Bean"); System.err.println(clazz.getName()); }}
运行观察控制台输出:
com.jinggujin.classloader.Bean
我们发现,在控制台中仅输出了我们打印的类名信息,而静态代码块没有执行,除此之外,其实我们还可以使用Class.forName(String name)
的重写方法forName(String name, boolean initialize, ClassLoader loader)
,同样可以达到静默加载的效果。
0 0
- JAVA静默加载Class
- java加载class过程
- java class加载
- java中class加载流程
- java动态加载jar,class
- java学习Class动态加载
- java class reload 动态加载
- java Class 的加载时机
- java class文件的加载
- java加载class文件(类加载机制)
- Java Class的热替换 自定义ClassLoader加载.class
- java加密class和解密class加载运行
- Java Class的热替换 自定义ClassLoader加载.class
- Java Class的热替换 自定义ClassLoader加载.class
- Java Class的热替换 自定义ClassLoader加载.class
- 解析Java Class Loader 类加载过程
- 在Java中动态加载class
- java中动态加载类 Class.forName
- ExpressionTreeViewer安装与碰到的问题
- Spring3与hibernate4 整合 (No Session found for current thread)
- 题目1480:最大上升子序列和
- Activity的onActivityResult 接收不到返回结果的解决办法
- Android Studio 快捷键设置
- JAVA静默加载Class
- 排序算法之直接插入排序
- NAU8810相关问题
- Node之文件路径处理模块:path模块
- 最小生成树+并查集模板
- python3.6学习笔记
- 请自觉为多态的基类声明virtual析构函数
- 页面选择列表实现逐一添加到容器中
- 同步异步和阻塞非阻塞的区别