`
houjx
  • 浏览: 7976 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

探索Class的奥秘(二)——forName方法

阅读更多

Class类的forName方法是进行反射的核心,它让我们可以随意加载指定的类。Class分别提供了两个forName方法,一个是单参数的,我们只需要把一个表示类的名称的String传进去就可以获得这个类的类型(Class)对象,从而可以进一步进行实例化操作。而另一个三参数的forName方法则是本次的重点。

三个参数分别为String nameboolean 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这个参数,在查询过源码之后发现,如果该参数为nullJava会判断本地系统是否有获取加载器的权限,之所以如果是由于RMI可以通过URL来实例化远程对象,为了系统的安全才做出这样的机制。

在源码中,loadernull时并没有自动生成一个加载器就进行底层调用了,因此猜测加载器将由底层来实现,所以loader就为null了。

分享到:
评论

相关推荐

    java中Class.forName方法的作用详解

    Java中的`Class.forName()`方法是一个非常关键的工具,主要用于动态加载类。它的作用在于根据给定的类全名(包括包名)返回对应的`Class`对象。`Class`对象是Java反射机制的基础,它代表着运行时的类信息,可以通过...

    Class.forName

    `Class.forName()`是Java中一个非常重要的方法,它主要用于动态加载和实例化类。这个方法在编程中常常用于实现灵活性和解耦,特别是在框架和插件系统中。下面将详细解释`Class.forName()`的工作原理、用途及其与`new...

    Java中通过Class类获取Class对象的方法详解

    通过Class类可以获取Class对象,获取Class对象有三种方式:通过Object类的getClass()方法、通过类名.class获取Class对象、通过Class类中的forName()方法。每种方式都有其特点和应用场景,掌握这些方式可以帮助开发者...

    Java Class.forName()无法加载类

    NULL 博文链接:https://listen-raining.iteye.com/blog/1894456

    class literal & instance.getClass() & Class.forName(String className)

    在Java编程语言中,"class literal"、"instance.getClass()" 和 "Class.forName(String className)" 是三个与类加载和类型查询紧密相关的概念。了解这些概念对于深入理解Java运行时的类加载机制至关重要。 首先,让...

    Classfor的用法

    #### 二、Class.forName 的基础使用 `Class.forName` 的基本语法如下: ```java Class&lt;?&gt; clazz = Class.forName("全限定类名"); ``` 这里的“全限定类名”指的是包含包名的类名,例如 `"java.lang.String"` 或者...

    java元数据——CLass类

    1. 通过 Class 的 forName(String name) 方法传入一个类的完整类路径,也可以获得Class 对象,但由于使用的是字符串,必须强制转换才可以获取泛型的Class的Class对象,并且你应该考虑到这个方法可能抛出的 ...

    在Java的反射中,Class.forName和Class

    首先,`Class.forName(String className)`是Java反射API中的一个静态方法,它用于根据给定的全限定类名(包括包名)动态地加载类。当你的应用程序需要在运行时才知道要使用哪个类,或者想要延迟加载某个类以提高性能...

    Java Class.forName()用法和newInstance()方法原理解析

    Java Class.forName()用法和newInstance()方法原理解析 Class.forName()方法是Java语言中的一种Class加载机制,它可以根据类名将对应的类加载到JVM中,同时也可以实例化该类。Class.forName()方法的主要功能是要求...

    浅谈java中类名.class, class.forName(), getClass()的区别

    第二种方式:class.forName() class.forName() 是另外一种获取 Class 对象的方式。例如,Class.forName("TestClass") 就可以获取 TestClass 的 Class 对象。当我们使用 class.forName() 的方式获取 Class 对象时,...

    forname实现工程内部反射机制

    在“forname实现工程内部反射机制”这个主题中,我们将深入探讨如何利用`Class.forName()`方法来实现对工程内部类的动态访问。 首先,让我们了解`Class.forName()`的基本用法。这个方法接收一个字符串参数,该参数...

    java中Class.forName的作用浅谈

    在Java编程语言中,`Class.forName()`方法是一个非常重要的功能,它主要用于动态加载类到Java虚拟机(JVM)中。这个方法的主要作用是根据给定的全限定类名(包括包名和类名)来查找并加载对应的类。下面我们将深入...

    Snoopy.class.php——登陆采集利器

    Snoopy的特点: 1、抓取网页的内容 fetch ...3、抓取网页的链接,表单 fetchlinks fetchform 4、支持代理主机 ...6、支持设置 user_agent, referer(来路), cookies 和 header content(头文件) 7、支持浏览器重定向,并能...

    Class.forName()_newInstance()_New_三者区别

    首先,`Class.forName("className")` 是一个静态方法,它用于在运行时动态加载指定的类。它的主要作用是告诉Java虚拟机(JVM)去查找并加载类。如果类尚未被加载到内存中,JVM会按照类路径去寻找对应的`.class`文件...

    class——Java高级开发工程师必须懂得

    - **动态加载类**: 通过`Class.forName()`方法在运行时加载类,然后通过`newInstance()`创建对象。这种方式允许程序在运行时决定加载哪些类,提高了代码的灵活性。 动态加载类的一个常见应用场景是处理模块化或...

    博客《 夯实JAVA基本之二 —— 反射(3):类内部信息获取》对应源码

    1. 使用`Class.forName("全限定类名")`,传入类的完全限定名(包括包名和类名)。 2. 对象的`getClass()`方法,如`MyClass obj = new MyClass(); Class&lt;?&gt; clazz = obj.getClass();` 3. 类的`class`关键字,如`Class...

    注册驱动:Class.forName(xxx.Driver).xmind

    对SPI,理论联系实际的理解

    LanguageFeatureso——对不能修改的类添加功能——使用扩展方法

    在C#编程语言中,扩展方法是一个非常实用的语言特性,它允许我们在不修改原有类的源代码情况下,向已存在的类添加新方法。这在处理第三方库或者无法直接修改的类时尤其有用。本篇文章将深入探讨如何使用扩展方法来为...

    Class对象获取的三种方法

    获取`Class`对象的方法有多种,其中最为常见的便是通过`.class`语法、`Class.forName(String name)`以及对象实例的`.getClass()`方法。下面将详细阐述这三种获取`Class`对象的方式及其应用场景。 ### 1\. 使用`....

Global site tag (gtag.js) - Google Analytics