Class类的forName方法是进行反射的核心,它让我们可以随意加载指定的类。Class分别提供了两个forName方法,一个是单参数的,我们只需要把一个表示类的名称的String传进去就可以获得这个类的类型(Class)对象,从而可以进一步进行实例化操作。而另一个三参数的forName方法则是本次的重点。
三个参数分别为String name、boolean initialize以及ClassLoader loader
String name参数指的是类的名称与单参数forName方法的参数是相同意义的。
ClassLoader loader参数指的是类的加载器,一般每个类都有指定的加载器,不可随便选择。
boolean initialize参数指的是在进行类加载时是否执行静态代码块。如果此参数为true时,当我们加载类就会执行静态代码块;如果此参数为false时,当我们加载类时则不会执行静态代码块。通过如下代码我们可以看到效果:
public class Test{ static{ System.out.println("要先生蛋"); } Test(){ System.out.println("破壳啦~"); } } class Test2 { public static void main(String[] args) { Class<? extends Object> c = null; try { c = Class.forName("Test", true, Test.class.getClassLoader()); //c = Class.forName("Test", false, Test.class.getClassLoader()); System.out.println("****类别准备实体化"); //Object o = c.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
通过实例我们可以发现的确是如此的。
另一方面从这个方法我们不难推测Java的对象实例化过程大致可以分为两步,一步是加载类,一步是生成实例化对象。
在我们执行反射时,首先使用forName方法进行类的加载,再调用newInstance方法进行对象实例化。这样有利于我们进行动态的设计。
而我们一般使用的new关键字,则在进行实例化时把加载与实例化两步顺序执行。
对于ClassLoader loader这个参数,在查询过源码之后发现,如果该参数为null,Java会判断本地系统是否有获取加载器的权限,之所以如果是由于RMI可以通过URL来实例化远程对象,为了系统的安全才做出这样的机制。
在源码中,loader为null时并没有自动生成一个加载器就进行底层调用了,因此猜测加载器将由底层来实现,所以loader就为null了。
相关推荐
Class.forName(xxx.xx.xx) 返回的是一个类,但Class.forName方法的作用到底是什么終?下面这篇文章就来给大家详细介绍了关于java中Class.forName方法的作用,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来...
Class.forName(xxx.xx.xx) 返回的是一个类 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
NULL 博文链接:https://listen-raining.iteye.com/blog/1894456
class.forname的作用.doc 详细解析抽象类和接口的区别.doc
Classfor的用法以及forName的定义,对字符串重新定义为一个对象的用法
NULL 博文链接:https://wuaner.iteye.com/blog/1009134
Snoopy的特点: 1、抓取网页的内容 fetch ...3、抓取网页的链接,表单 fetchlinks fetchform 4、支持代理主机 ...6、支持设置 user_agent, referer(来路), cookies 和 header content(头文件) 7、支持浏览器重定向,并能...
python 怎么调用class中的函数(csdn)————程序
对SPI,理论联系实际的理解
在Java的反射中,Class.forName和ClassLoader的区别共4页.pdf.zip
python数据类dataclass修饰器(csdn)————程序
并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c
核心语法-python--Class语法01(csdn)————程序
下面小编就为大家带来一篇浅谈java中类名.class, class.forName(), getClass()的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
介绍了java中Class.forName的作用,有需要的朋友可以参考一下
Java中 Class.forName()_newInstance()_New_三者区别。
主要介绍了Java Class.forName()用法和newInstance()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
* Class Class.forName(String packageNameAndClassName); * Class 类的静态成员方法通过完整的包名.类名获取对应的.class文件的class对象 * 同时也可以作为.class文件加载的方式 * * Class 类名.class; * ...
主要介绍了jdbc中class.forname的作用,使用示例说明了他作用及使用方法,大家参考使用吧