java实现静默加载Class示例代码
前言
本文主要介绍了关于java静默加载class的相关内容,之所以有这篇文章,是因为有时候在开发的时候,我们有这样的场景,我们只想得到一个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)
,同样可以达到静默加载的效果。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。