JAVA静默加载Class

原创 2017年04月28日 10:12:39

有时候在开发的时候,我们有这样的场景,我们只想得到一个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)会触发静态代码块,那么,要实现静默加载,我们就不能用这种方式了,我们可以使用ClassLoaderloadClass(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),同样可以达到静默加载的效果。

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/jianggujin/article/details/70886606

一看你就懂,超详细java中的ClassLoader详解

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解Class...
  • briblue
  • briblue
  • 2017-02-10 19:26:54
  • 65530

Java 动态加载class 并反射调用方法

反射方法: public static void main(String[] args) throws Exception {      File file=new File("D:/clas...
  • hanghangaidoudou
  • hanghangaidoudou
  • 2016-09-04 11:25:48
  • 3064

Java中动态加载jar文件和class文件

概述   诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类...
  • mousebaby808
  • mousebaby808
  • 2014-06-17 17:57:15
  • 30683

java ClassLoader机制和如何加载外部class文件(含代码)

介绍了java是如何加载class文件的,和如何加载网络或硬盘上的class文件。ClassLoader的机制。...
  • zhjali123
  • zhjali123
  • 2015-03-04 13:53:03
  • 4908

在Java中动态加载class

   Java的一个强大的特性是能够动态加载一个给定名称的类,而事先不需要指导这个类的名字。这个特性使得Java的开发人员能够构造一个不需要重新编译即可扩展和修改的灵活动态的系统,在Java中,动态加...
  • duxu2004
  • duxu2004
  • 2006-04-25 09:54:00
  • 7125

java动态加载类和静态加载类

一.什么是动态加载类 什么是静态加载类 Class.forName 不仅表示类的类类型,还代表了动态加载类。编译时加载是静态加载类, 运行时加载是动态加载类。 请大家区分编译 运行。 二.为何要使用动...
  • su20145104009
  • su20145104009
  • 2016-10-26 16:23:40
  • 2716

Java 加载class和创建对象的三种形式

Java加载class主要分为以下三种类型: 一、Class cls=Class.forName(“包名.类名”)  Object obj=cls.newInstance();创建对象 二、Class...
  • jiabailong
  • jiabailong
  • 2016-10-25 16:52:59
  • 3267

JAVA 类加载过程详细讲解 -jvm加载类机制CLass Loading

jvm加载类机制CLass Loading
  • tangdong3415
  • tangdong3415
  • 2016-12-20 20:02:36
  • 8509

java中class.forName和classLoader加载类的区分

java中class.forName和classLoader都可用来对类进行加载。前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。而classLoader...
  • u011202334
  • u011202334
  • 2016-05-25 14:12:34
  • 2710

java加载class文件(类加载机制)

一概述:在编译期,所有的*.java文件被编译成.class文件。在运行期,class文件只有被加载到jvm内存中才能运行。这个装载工作是由类装载器完成的。实质就是把class文件从硬盘读取到内存中,...
  • takemetofly
  • takemetofly
  • 2015-06-23 15:23:29
  • 2102
收藏助手
不良信息举报
您举报文章:JAVA静默加载Class
举报原因:
原因补充:

(最多只允许输入30个字)