- 浏览: 204401 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (231)
- C++学习 (41)
- vc学习 (25)
- vc异常 (4)
- Flex (2)
- Ext (0)
- java学习笔记 (15)
- mysql学习笔记 (1)
- ibatis学习笔记 (7)
- struts1学习笔记 (1)
- hibernate学习笔记 (3)
- javascript学习笔记 (8)
- eclipse快捷键 (2)
- 英语学习 (1)
- cmd (1)
- eclipse 配置 (2)
- 其他 (4)
- JAVASE (34)
- firefox (1)
- linux (8)
- Apache (6)
- cms (22)
- jsuc (10)
- html (3)
- css (1)
- 作图 (2)
- vs2012 (2)
- 编码转换 (12)
- work_unicode (1)
- work_webbrowser (1)
- work_trade_quotes_login (1)
- c#学习 (38)
- wpf学习 (31)
- wpf快速学习 (1)
- VB学习 (1)
- NSIS (4)
- log4cpp (3)
- 学习web (1)
- 经验 (1)
- c_汇编 (1)
最新评论
反射&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()是一样的。是没有任何意义的。
发表评论
-
subString()包头不包尾。
2012-12-17 17:07 1765subString()包头不包尾。 -
网络编程
2012-11-14 09:12 751网络编程 1 import java.net.*; im ... -
线程同步
2012-11-14 09:12 683线程同步 1 synchronized 1) 修饰某个 ... -
Thread
2012-11-14 09:12 725Thread 1 java.lang.Thread ... -
输入/输出流
2012-11-14 09:12 557输入/输出流 1 分类 方向不同,输入流和输出流; 处 ... -
Collection
2012-11-15 10:08 406Collection 1 1) Set中的数据对象没有顺 ... -
枚举Enum
2012-11-15 10:09 594枚举 只能够取特定值中的一个。 int(short byt ... -
System
2012-11-15 10:10 602System.setOut(PrintStream out) ... -
StringBuffer
2012-11-16 09:26 632StringBuffer StringBuffer代表可变的 ... -
Map
2012-11-16 09:27 822Map 1 Map m1=new HashMap();m1 ... -
持有对方引用
2012-11-16 09:27 586持有对方引用 import java.awt.*; im ... -
内部类
2012-11-15 10:09 655内部类 1 可以方便的访问包装类的成员; 该类不允许或不 ... -
事件监听
2012-11-15 10:09 714事件监听 public class TestActionEv ... -
sleep,wait(非原创)
2012-11-09 09:26 680sleep,wait 1、 这两个方法来自不同的类分别是 ... -
Iterator
2012-11-16 09:27 774Iterator 1 Iterator对象的remove方 ... -
数组,
2012-11-08 09:54 581数组 1 声明时不能指定长度;例如int a[5]//非法 ... -
abstract
2012-11-08 09:55 6451 abstract关键字修饰类,抽象类, 修饰方法,抽象 ... -
equals,hashcode(非原创)
2012-11-08 09:55 690equals,hashcode 1 Object中的equ ... -
构造方法
2012-11-08 09:55 623构造方法 1 子类构造方法过程必须调用基类的构造方法; ... -
方法重写(override)
2012-11-08 09:56 580方法重写 相同方法名,参数列表,返回类型; 重写方法不能比 ...
相关推荐
Java类加载器、反射机制和模块化 一、类加载器 1.1 类加载机制 类加载是指将.class文件读入内存,并为之创建一个java.lang.Class对象。任何类被使用时,系统都会为之建立一个java.lang.Class对象。类加载机制分为...
在实际应用中,我们可以通过反射API来使用自定义ClassLoader加载的类。例如,我们可以创建一个`Class`对象,然后调用`newInstance()`方法来创建该类的实例。 总结来说,Java ClassLoader的定制是一项强大的技术,它...
本案例将深入探讨如何创建一个自定义的ClassLoader,利用Java反射和注解技术实现运行时功能更新。 首先,了解ClassLoader的工作原理。Java中的类加载过程分为三个阶段:加载、验证、准备、解析和初始化。默认情况下...
### ClassLoader概述 在Java中,`ClassLoader`是负责加载类到JVM的重要组件之一。它不仅能够确保每个被加载的类都具有唯一的标识符,还能处理类的生命周期中的加载、连接(验证、准备和解析)及初始化等关键步骤。 ...
比如,创建类的实例、反射调用、启动主类、使用静态字段或方法等。虚拟机规范定义了五种主动引用,其他情况则视为被动引用,不会立即触发初始化。 例如,通过子类引用父类的静态字段只会初始化父类,而不会初始化子...
在反射过程中,如果没有加载目标类,那么会触发ClassLoader的加载机制。 总结,理解ClassLoader的加载机制和原理对于优化程序性能、设计可扩展的系统至关重要。通过自定义ClassLoader,开发者可以实现许多高级功能...
不同类加载器加载的类被视为不同的类,不能直接相互访问,但可以通过反射机制实现。 **知识点10:类的唯一性** 同一类加载器加载同一个类只会有一个Class对象,再次加载时会检查内存中是否已有对应Class对象,避免...
反射API(如Class.forName())在查找类时也会涉及到ClassLoader。开发者可以指定ClassLoader来加载特定的类,这在处理动态加载或插件系统时非常有用。 8. 源码分析: 阅读ClassLoader的源码可以帮助我们理解其...
### Java反射机制知识点总结 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种强大特性,它使得程序可以在运行时动态地获取类的信息并直接操作对象的内部属性和方法。这种能力使得Java具备了一种动态...
3.动态类加载:可以使用反射机制来动态地加载一个类,例如使用 `ClassLoader` 类来加载一个类。 四、反射机制的优点和缺点 反射机制的优点: * 可以动态地检查和修改类的结构和行为 * 可以实现松耦合的设计 * ...
热更新通常依赖于类加载器(Classloader)的工作原理来实现,本篇文章将深入探讨如何利用Android的类加载器实现热更新的机制。 首先,我们需要理解什么是类加载器。在Java和Android中,类加载器是负责查找、加载和...
通过`Class.forName()`方法或者`ClassLoader`的`loadClass()`方法,可以根据类名字符串在运行时加载类。 #### 七、操作成员 - **创建对象**:使用`Class`对象的`newInstance()`方法。 - **访问和修改字段**:使用`...
### 反射机制详解 #### 一、反射机制概述 反射是Java的一项核心特性,它使得Java程序在运行时能够动态地获取类的信息,并且能够直接操作这些信息。这种能力在许多其他编程语言中并不常见,例如在Pascal、C或C++中...
在Android系统中,反射机制是一种强大的编程技巧,它允许运行时动态访问类、接口、字段和方法,即使这些元素在编译时未知。通过反射,我们可以执行一些在常规编程中无法实现的操作,例如启动未安装的APK中的Activity...
8. 类加载器:类的加载由类加载器完成,反射可以操作类加载器,通过`ClassLoader.loadClass()`来加载类。 9. 静态方法和静态字段的访问:反射也可以调用静态方法和访问静态字段,分别使用`Method.invoke(null, ...
它需要三个参数:一个ClassLoader,表示用来加载代理类的类加载器;一个Interface[],表示代理对象需要实现的接口列表;以及一个InvocationHandler,表示代理对象在调用接口方法时会委托给的处理程序。 2. **...
在“不可见类访问”这个主题中,徐培成老师可能会讲解如何处理这种问题,例如使用反射API(java.lang.reflect)来访问非公共类或者使用相同的类加载器加载相关类,以实现类间的可见性。此外,他还可能会讨论如何通过...
Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...