java实现静默加载Class示例代码

作者:蒋固金 时间:2023-12-18 22:06:52 

前言

本文主要介绍了关于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) ,同样可以达到静默加载的效果。

来源:http://blog.csdn.net/jianggujin/article/details/70886606

标签:java,静默加载,class
0
投稿

猜你喜欢

  • Android ListView的Item点击效果的定制

    2023-06-21 11:46:01
  • Java List 用法实例详解

    2022-11-29 05:27:20
  • Java Comparable 和 Comparator 的详解及区别

    2023-07-05 10:41:44
  • Springboot @Validated和@Valid的区别及使用详解

    2023-05-30 18:40:25
  • 在C#和Java语言中for和foreach的区别详解

    2023-01-29 11:31:13
  • SpringBoot日志框架之Log4j2快速入门与参数详解

    2023-11-15 21:17:59
  • Java执行SQL脚本文件到数据库详解

    2023-08-08 08:30:00
  • 如何设置Spring Boot测试时的日志级别

    2023-11-10 14:11:20
  • C#遍历子目录的方法

    2022-06-30 11:11:27
  • java实现拼图游戏

    2022-09-21 11:14:19
  • 解决Eclipse的Servers视图中无法添加Tomcat6/Tomcat7的方法

    2023-03-30 22:22:27
  • 基于javaMybatis存进时间戳的问题

    2023-11-29 02:55:51
  • C#中is和as用法实例分析

    2023-08-17 06:21:42
  • Android 简单实现倒计时功能

    2023-06-27 11:35:40
  • Android左右滑出菜单实例分析

    2021-06-20 11:29:20
  • Android 开发之Dialog,Toast,Snackbar提醒

    2021-05-31 14:27:20
  • 浅谈JSON的数据交换、缓存问题和同步问题

    2021-08-08 09:31:25
  • android获取屏幕高度和宽度的实现方法

    2023-05-31 04:45:58
  • Mybatis plus多租户方案的实战踩坑记录

    2023-08-01 05:19:09
  • Kotlin try catch异常处理i详解

    2022-10-14 19:55:50
  • asp之家 软件编程 m.aspxhome.com