Java静默加载Class实现的示例代码
这篇文章主要给大家介绍了关于java实现静默加载Class的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
前言
本文主要介绍了关于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)
,同样可以达到静默加载的效果。
总结
以上是Java静默加载Class实现的示例代码的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处
