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),同样可以达到静默加载的效果。

版权声明:本文为博主原创文章,转载请标明出处。

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

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

Java类加载机制

类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和...
  • xgdofull
  • xgdofull
  • 2010年05月26日 11:08
  • 13437

Java类的加载过程

编译:即javac的过程,即把.java文件编译成.class文件,即编译成字节码文件,同时做一些类型以及格式的检查。      类只有在要运行的时候才会被加载进JVM,即编译后只有需要到这...
  • zcxwww
  • zcxwww
  • 2016年05月06日 12:50
  • 3865

java 载入类的三种方法

载入类的几种方法 所有资源都通过ClassLoader载入到JVM里,那么在载入资源时当然可以使用ClassLoader,只是对于不同的资源还可以使用一些别的方式载入,例如对于类可以直接ne...
  • AlbertFly
  • AlbertFly
  • 2016年08月25日 12:01
  • 381

java动态加载jar包,并运行其中的类和方法

动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。 下面通过一个实例来直观演示: 第...
  • wawmg
  • wawmg
  • 2014年01月07日 16:58
  • 56729

实现静默安装和卸载应用

前段时间做了一个批量安装卸载应用程序的小应用,由于安装卸载应用程序的部 分API是隐藏的,所以必须在ubuntu下下载Android系统源码,并编译之后使用MM命令编译生成APK文件,其实也难。思路是...
  • younizhizu2016
  • younizhizu2016
  • 2016年07月13日 22:43
  • 997

JAVA中类的加载过程

java中类的加载过程
  • sinat_19650093
  • sinat_19650093
  • 2016年03月20日 21:56
  • 3908

java项目资源加载的几种方法

做项目也有一段时间了,对资源加载这方面一直没太搞清楚,在看了tomcat加载资源的方式后,来做一个总结! 如图: 要在ClassLoaderTest类的main方法里面加载资源有一下几...
  • u012550460
  • u012550460
  • 2015年12月02日 21:55
  • 721

Linux下后台静默运行jar程序

命令[root@template tmp]# nohup java -jar HelloWorld.jar >temp.txt & 解释下 >temp.txt command >out.file ...
  • maobois
  • maobois
  • 2017年04月19日 15:15
  • 1186

通过DownloadManager来下载并静默安装APK

当产品有BUG需要被修复的时候,我们可以使用DownloadManager 系统提供的下载类来实现 下载新版本的APK,并通过静默安装的方式,将APK神不知鬼不觉的安装到手机中,静默安装分为两种方式,...
  • qq_37842258
  • qq_37842258
  • 2017年06月03日 10:46
  • 808
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA静默加载Class
举报原因:
原因补充:

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