动态加载类 2种方法极其区别

原创 2012年03月23日 16:14:19

1. Class.forName

        Class t = null;
        t = Class.forName(m_sImplClassName);
        ICX_NET bObj = (ICX_NET)t.getConstructor( null ).newInstance( null );

2. LoadClass

filterClass= Thread.currentThread().getContextClassLoader().loadClass(className);

filter = (Filter) filterClass.newInstance();


区别简单说:

功能一样,只是使用forName是完整的类加载初始化过程,调用forName后,对应类的static{}块立即会被执行

而loadClass调用后,不会立即执行,但是会在newInstance后面执行


以下内容为转载:

Class的装载分了三个阶段,loading,linking和initializing,分别定义在The Java Language Specification的12.2,12.3和12.4。
Class.forName(className)实际上是调用Class.forName(className, true, this.getClass().getClassLoader())。注意第二个参数,是指Class被loading后是不是必须被初始化。
ClassLoader.loadClass(className)实际上调用的是ClassLoader.loadClass(name, false),第二个参数指出Class是否被link。
区别就出来了。Class.forName(className)装载的class已经被初始化,而ClassLoader.loadClass(className)装载的class还没有被link。
一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。
例如,在JDBC编程中,常看到这样的用法,Class.forName("com.mysql.jdbc.Driver"),如果换成了getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行。
为什么呢?打开com.mysql.jdbc.Driver的源代码看看,
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
原来,Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。所以这个地方就只能用Class.forName(className)。


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

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

类的动态加载-2

1.通过new创建对象是静态加载,如图一,假如此时Word类和Excel类并不存在,Office类是不可以通过编译的,再假如一个类中要对很多类进行实例化,都是通过New实例化的,那么,但凡有一个类出问...
  • qq_24776307
  • qq_24776307
  • 2016年08月25日 18:28
  • 85

类加载器与动态代理

一、类加载器 1、什么是类加载器 类加载器就是加载类的工具,java虚拟机JVM运行类的第一件事就是将这个类的字节码加载进来, 即类加载器工具类的名称定位和生产类的字节码数据,然后返回给JVM。...
  • wyswlp
  • wyswlp
  • 2013年11月19日 20:44
  • 2628

JAVA动态加载类和静态加载类

1.JAVA动态加载类和静态加载类的区别     new创建对象的方式称作为静态加载,而使用Class.forName("XXX")称作为动态加载,它们俩本质的区别在于静态加载的类的源程序在编译时期加...
  • geekerhw
  • geekerhw
  • 2015年07月28日 17:21
  • 5054

Linux上C++类的动态加载

Linux上C++类的动态加载 摘要:本文是翻译文章,主要介绍了运行时重载C++类的技术,包括了Linux上的动态加载接口、C++类的动态加载技术点及实现、自动加载技术等。最后给出了两个应用案例...
  • zdy0_2004
  • zdy0_2004
  • 2015年04月27日 00:24
  • 1654

Java动态加载一个类的几种方法以及invoke

接口 IUser package org.me.javaapp; /** * * @author Administrator */ public interface IUser { ...
  • unix21
  • unix21
  • 2016年03月09日 15:46
  • 4190

Unity中资源动态加载的几种方式比较

http://blog.csdn.net/leonwei/article/details/18406103 初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到...
  • OnafioO
  • OnafioO
  • 2014年12月01日 20:47
  • 1400

RMI应用的部署及类的动态加载

这是根据我上一篇Java RMI实例的代码进行的配置
  • zlp1992
  • zlp1992
  • 2014年10月25日 19:30
  • 974

C#反射、动态加载类 .

using System; using System.Collections.Generic; using System.Text; using System.Reflection;//注意要添加这个...
  • Game_jqd
  • Game_jqd
  • 2014年05月14日 10:45
  • 782

动态链接库加载函数的两种方法及区别

动态链接库的编写: 1.创建一WIN32动态链接库工程Dll1,添加一C++源文件Dll1.cpp,在源文件中编写一个测试函数 int _stdcall add(int a, int b)...
  • zzandyc
  • zzandyc
  • 2017年04月18日 11:54
  • 570
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态加载类 2种方法极其区别
举报原因:
原因补充:

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