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了。
相关推荐
Java中的`Class.forName()`方法是一个非常关键的工具,主要用于动态加载类。它的作用在于根据给定的类全名(包括包名)返回对应的`Class`对象。`Class`对象是Java反射机制的基础,它代表着运行时的类信息,可以通过...
`Class.forName()`是Java中一个非常重要的方法,它主要用于动态加载和实例化类。这个方法在编程中常常用于实现灵活性和解耦,特别是在框架和插件系统中。下面将详细解释`Class.forName()`的工作原理、用途及其与`new...
通过Class类可以获取Class对象,获取Class对象有三种方式:通过Object类的getClass()方法、通过类名.class获取Class对象、通过Class类中的forName()方法。每种方式都有其特点和应用场景,掌握这些方式可以帮助开发者...
NULL 博文链接:https://listen-raining.iteye.com/blog/1894456
在Java编程语言中,"class literal"、"instance.getClass()" 和 "Class.forName(String className)" 是三个与类加载和类型查询紧密相关的概念。了解这些概念对于深入理解Java运行时的类加载机制至关重要。 首先,让...
#### 二、Class.forName 的基础使用 `Class.forName` 的基本语法如下: ```java Class<?> clazz = Class.forName("全限定类名"); ``` 这里的“全限定类名”指的是包含包名的类名,例如 `"java.lang.String"` 或者...
1. 通过 Class 的 forName(String name) 方法传入一个类的完整类路径,也可以获得Class 对象,但由于使用的是字符串,必须强制转换才可以获取泛型的Class的Class对象,并且你应该考虑到这个方法可能抛出的 ...
首先,`Class.forName(String className)`是Java反射API中的一个静态方法,它用于根据给定的全限定类名(包括包名)动态地加载类。当你的应用程序需要在运行时才知道要使用哪个类,或者想要延迟加载某个类以提高性能...
Java Class.forName()用法和newInstance()方法原理解析 Class.forName()方法是Java语言中的一种Class加载机制,它可以根据类名将对应的类加载到JVM中,同时也可以实例化该类。Class.forName()方法的主要功能是要求...
第二种方式:class.forName() class.forName() 是另外一种获取 Class 对象的方式。例如,Class.forName("TestClass") 就可以获取 TestClass 的 Class 对象。当我们使用 class.forName() 的方式获取 Class 对象时,...
在“forname实现工程内部反射机制”这个主题中,我们将深入探讨如何利用`Class.forName()`方法来实现对工程内部类的动态访问。 首先,让我们了解`Class.forName()`的基本用法。这个方法接收一个字符串参数,该参数...
在Java编程语言中,`Class.forName()`方法是一个非常重要的功能,它主要用于动态加载类到Java虚拟机(JVM)中。这个方法的主要作用是根据给定的全限定类名(包括包名和类名)来查找并加载对应的类。下面我们将深入...
Snoopy的特点: 1、抓取网页的内容 fetch ...3、抓取网页的链接,表单 fetchlinks fetchform 4、支持代理主机 ...6、支持设置 user_agent, referer(来路), cookies 和 header content(头文件) 7、支持浏览器重定向,并能...
首先,`Class.forName("className")` 是一个静态方法,它用于在运行时动态加载指定的类。它的主要作用是告诉Java虚拟机(JVM)去查找并加载类。如果类尚未被加载到内存中,JVM会按照类路径去寻找对应的`.class`文件...
- **动态加载类**: 通过`Class.forName()`方法在运行时加载类,然后通过`newInstance()`创建对象。这种方式允许程序在运行时决定加载哪些类,提高了代码的灵活性。 动态加载类的一个常见应用场景是处理模块化或...
1. 使用`Class.forName("全限定类名")`,传入类的完全限定名(包括包名和类名)。 2. 对象的`getClass()`方法,如`MyClass obj = new MyClass(); Class<?> clazz = obj.getClass();` 3. 类的`class`关键字,如`Class...
对SPI,理论联系实际的理解
在C#编程语言中,扩展方法是一个非常实用的语言特性,它允许我们在不修改原有类的源代码情况下,向已存在的类添加新方法。这在处理第三方库或者无法直接修改的类时尤其有用。本篇文章将深入探讨如何使用扩展方法来为...
获取`Class`对象的方法有多种,其中最为常见的便是通过`.class`语法、`Class.forName(String name)`以及对象实例的`.getClass()`方法。下面将详细阐述这三种获取`Class`对象的方式及其应用场景。 ### 1\. 使用`....