• 技术文章 >Java >java教程

    Java静默加载Class实现的示例代码

    黄舟黄舟2017-10-18 10:23:33原创770
    这篇文章主要给大家介绍了关于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中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Class Java 实现
    上一篇:Java分解任意输入数的质因数算法的实现示例 下一篇:Java中猴子吃桃问题算法实现的示例
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 实例详解Java基础的控制语句• Java集合框架之PriorityQueue优先级队列• 一起来聊聊与Java中性能相关的设计模式• JAVA外观模式详解• Java图文详解之实现图书管理系统
    1/1

    PHP中文网