`

反射&ClassLoader

 
阅读更多

反射&ClassLoader

1

private void m11() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
	String className = "T";
  	Class clazz = Class.forName(className);
  	Object o = clazz.newInstance();
  	Method[] methods = clazz.getMethods();
  	for(Method m : methods) {
   		m.invoke(o, 1, 2);
  	}
}

 

2

Class clazz = Class.forName("XXX.XXX");

ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class clazz = cl.loadClass("XXX.XXX");
都可以装载一个类那么他们的区别是什么呢?
进一步研究Class.forName()是调用
Class.forName(name, initialize, loader);
也就是Class.forName("XXX.XXX"); 等同与 Class.forName("XXX.XXX", true, CALLCLASS.class.getClassLoader());

第二次参数表示装载类的时候是否初始化该类, 即调用类的静态块的语句及初始化静态成员变量。


Class clazz =cl.loadClass("XXX.XXX");
没有指定是否初始化的选项。只有执行clazz.newInstance();时才能够初始 化类。可以说Class.forName("XXX.XXX", false, cl)执行过程是一致的。只是 ClassLoader.loadClass()是更底层的操作。

看一下JDBC驱动的装载。
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbcurl");
当调用Class.forName("com.mysql.jdbc.Driver");Driver已经被初始化并注册到DriverManager中。MySQL Driver的代码
public class Driver extends NonRegisteringDriver
    implements java.sql.Driver
{

    public Driver()
        throws SQLException
    {
    }

    static 
    {
        try
        {
            DriverManager.registerDriver(new Driver());
        }
        catch(SQLException E)
        {
            throw new RuntimeException("Can't register driver!");
        }
    }
}
改修JDBC驱动的装载
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class clazz = cl.loadClass("com.mysql.jdbc.Driver");
clazz.newInstance();
Connection conn = DriverManager.getConnection("jdbcurl");
同样可以执行。但是这样就多构造了一个com.mysql.jdbc.Driver实例。同Class.forName("com.mysql.jdbc.Driver").newInstance()是一样的。是没有任何意义的。

分享到:
评论

相关推荐

    day15-类加载器&反射&模块化1

    Java类加载器、反射机制和模块化 一、类加载器 1.1 类加载机制 类加载是指将.class文件读入内存,并为之创建一个java.lang.Class对象。任何类被使用时,系统都会为之建立一个java.lang.Class对象。类加载机制分为...

    Java ClassLoader定制实例

    在实际应用中,我们可以通过反射API来使用自定义ClassLoader加载的类。例如,我们可以创建一个`Class`对象,然后调用`newInstance()`方法来创建该类的实例。 总结来说,Java ClassLoader的定制是一项强大的技术,它...

    ClassLoader 案例

    本案例将深入探讨如何创建一个自定义的ClassLoader,利用Java反射和注解技术实现运行时功能更新。 首先,了解ClassLoader的工作原理。Java中的类加载过程分为三个阶段:加载、验证、准备、解析和初始化。默认情况下...

    ClassLoader

    ### ClassLoader概述 在Java中,`ClassLoader`是负责加载类到JVM的重要组件之一。它不仅能够确保每个被加载的类都具有唯一的标识符,还能处理类的生命周期中的加载、连接(验证、准备和解析)及初始化等关键步骤。 ...

    深入理解ClassLoader工作机制.docx

    比如,创建类的实例、反射调用、启动主类、使用静态字段或方法等。虚拟机规范定义了五种主动引用,其他情况则视为被动引用,不会立即触发初始化。 例如,通过子类引用父类的静态字段只会初始化父类,而不会初始化子...

    ClassLoader类加载机制和原理详解

    在反射过程中,如果没有加载目标类,那么会触发ClassLoader的加载机制。 总结,理解ClassLoader的加载机制和原理对于优化程序性能、设计可扩展的系统至关重要。通过自定义ClassLoader,开发者可以实现许多高级功能...

    java中classLoader的使用

    不同类加载器加载的类被视为不同的类,不能直接相互访问,但可以通过反射机制实现。 **知识点10:类的唯一性** 同一类加载器加载同一个类只会有一个Class对象,再次加载时会检查内存中是否已有对应Class对象,避免...

    ClassLoader总结

    反射API(如Class.forName())在查找类时也会涉及到ClassLoader。开发者可以指定ClassLoader来加载特定的类,这在处理动态加载或插件系统时非常有用。 8. 源码分析: 阅读ClassLoader的源码可以帮助我们理解其...

    java反射机制

    ### Java反射机制知识点总结 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种强大特性,它使得程序可以在运行时动态地获取类的信息并直接操作对象的内部属性和方法。这种能力使得Java具备了一种动态...

    关于反射机制的面试题.

    3.动态类加载:可以使用反射机制来动态地加载一个类,例如使用 `ClassLoader` 类来加载一个类。 四、反射机制的优点和缺点 反射机制的优点: * 可以动态地检查和修改类的结构和行为 * 可以实现松耦合的设计 * ...

    Android 使用classloader原理进行热更新

    热更新通常依赖于类加载器(Classloader)的工作原理来实现,本篇文章将深入探讨如何利用Android的类加载器实现热更新的机制。 首先,我们需要理解什么是类加载器。在Java和Android中,类加载器是负责查找、加载和...

    java面试题--反射机制

    通过`Class.forName()`方法或者`ClassLoader`的`loadClass()`方法,可以根据类名字符串在运行时加载类。 #### 七、操作成员 - **创建对象**:使用`Class`对象的`newInstance()`方法。 - **访问和修改字段**:使用`...

    反射机制和类加载机制学习总结

    ### 反射机制详解 #### 一、反射机制概述 反射是Java的一项核心特性,它使得Java程序在运行时能够动态地获取类的信息,并且能够直接操作这些信息。这种能力在许多其他编程语言中并不常见,例如在Pascal、C或C++中...

    Android 通过反射启动未安装的APK中的Activity

    在Android系统中,反射机制是一种强大的编程技巧,它允许运行时动态访问类、接口、字段和方法,即使这些元素在编译时未知。通过反射,我们可以执行一些在常规编程中无法实现的操作,例如启动未安装的APK中的Activity...

    反射最基本代码

    8. 类加载器:类的加载由类加载器完成,反射可以操作类加载器,通过`ClassLoader.loadClass()`来加载类。 9. 静态方法和静态字段的访问:反射也可以调用静态方法和访问静态字段,分别使用`Method.invoke(null, ...

    AOP动态代理(反射机制)

    它需要三个参数:一个ClassLoader,表示用来加载代理类的类加载器;一个Interface[],表示代理对象需要实现的接口列表;以及一个InvocationHandler,表示代理对象在调用接口方法时会委托给的处理程序。 2. **...

    【IT十八掌徐培成】Java基础第25天-04.classLoader-系统资源-不可见类访问.zip

    在“不可见类访问”这个主题中,徐培成老师可能会讲解如何处理这种问题,例如使用反射API(java.lang.reflect)来访问非公共类或者使用相同的类加载器加载相关类,以实现类间的可见性。此外,他还可能会讨论如何通过...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...

Global site tag (gtag.js) - Google Analytics