- 浏览: 244036 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
问道721:
长见识了, 新建文档还不行, 写入内容后就可以了
利用poi操作word文档 -
laodongbao:
终于找到了我能理解和接受的的spring aop和动态代理的结 ...
spring Aop中动态代理 -
lqservlet:
可以看到存储文件! 全是xml文件,好多呀。
利用poi操作word文档 -
步青龙:
直接重命名xx.docx的文件为xx.zip,用WinRar打 ...
利用poi操作word文档 -
邦者无敌:
如果是JDK1.3呢?是否要将上面四个jar包手动加入
com.sun.crypto.provider.SunJCE
类名.class是Class对象的句柄,每个被加载的类,在jvm中都会有一个Class对象与之相对应,如果要创建新的对象,直接使用Class对象的局部class.forName就可以了,不需要用new 类名。
在java中,每个class都有一个相应的Class对象,当编写好一个类,编译完成后,在生成的.class文件中,就产生一个class对象,用来表示这个类的类型信息。获得Class实例的三中方式:
1.利用对象调用getClass()方法获取该对象的Class实例
2.使用Class的静态方法forName(),用类的名字获取一个Class实例
3.运用.calss的方式获取Class实例,对基本数据类型的封装类,还可以采用.TYPE来获取对应的基本数据类型的Class实例
calss ClassTest
{
public static void main(String[] args)
{
/*
//利用对象调用getClass()方法获取该对象的Class实例
Point pt=new Point();
Class c1=pt.getClass();
System.out.println(c1.getName()); //结果:Point
//使用Class的静态方法forName(),用类的名字获取一个Class实例
try
{
Class c2=Class.forName("Point");
System.out.println(c2.getName()); //结果:Point
}
catch(Exception e)
{
e.printStackTrace();
}
//运用.calss的方式获取Class实例(类)
Class c3=Point.calss;
System.out.println(c3.getName()); //结果:Point
//运用.calss的方式获取Class实例(基本类型)
Class c4=int.calss;
System.out.println(c4.getName()); //结果:int
//运用.calss的方式获取Class实例(基本数据类型的封装类)
Class c5=Integer.TYPE;
System.out.println(c5.getName()); //结果:int
Class c6=Integer.class;
System.out.println(c6.getName()); //结果:java.lang.Integer
*/
//以下结果是: before new Point()
loading point
after new Point()
loading Line
//当new Point()的时候加载这个类,用forName构造实例的时候也加载该类。
System.out.println("before new Point()");
new Point();
System.out.println("after new Point()");
try
{
Class.forName("Line");
}catch(Exception e)
{
e.printStackTrace();
}
}
}
class Point()
{
static
{
System.out.println("loading point");
}
int x,y;
}
class Line
{
static
{
System.out.println("loading Line");
}
}
在运行期间,如果我们要产生某个类的对象,java虚拟机会检测该类型的Class对象是否已被加载。如果没有加载,java虚拟机会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已经被加载到内存,就可以用它来产生该类型的所有对象。
newInstance()调用内中缺省的构造方法。
newInstance()调用类中缺省的构造方法,如果要实例的对象中有了自己定义的构造方法(除重写的和默认构造方法相同的构造方法外)
创建此 Class 对象所表示的类的一个新实例
class ClassTest
{
public static void main(String[] args)
{
if(args.length!=1)
{
System.out.println("args.length!=1");
return;
}
try
{
Class c=Class.forName(args[0]);
Point pt=(Point)c.newInstance();
pt.output();
}catch(Exception e)
{
e.printStackTrace();
}
}
}
class Point
{
int x;
int y;
static
{
System.out.println("Loading point");
}
void output()
{
System.out.println("x="+x+",y="+y);
}
}
当我们在命令提示符下面编译好该类之后,输入java ClassTest Point的时候,此时会输出Loading point和x=0,y=0
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()是一样的。是没有任何意义的。
在java中,每个class都有一个相应的Class对象,当编写好一个类,编译完成后,在生成的.class文件中,就产生一个class对象,用来表示这个类的类型信息。获得Class实例的三中方式:
1.利用对象调用getClass()方法获取该对象的Class实例
2.使用Class的静态方法forName(),用类的名字获取一个Class实例
3.运用.calss的方式获取Class实例,对基本数据类型的封装类,还可以采用.TYPE来获取对应的基本数据类型的Class实例
calss ClassTest
{
public static void main(String[] args)
{
/*
//利用对象调用getClass()方法获取该对象的Class实例
Point pt=new Point();
Class c1=pt.getClass();
System.out.println(c1.getName()); //结果:Point
//使用Class的静态方法forName(),用类的名字获取一个Class实例
try
{
Class c2=Class.forName("Point");
System.out.println(c2.getName()); //结果:Point
}
catch(Exception e)
{
e.printStackTrace();
}
//运用.calss的方式获取Class实例(类)
Class c3=Point.calss;
System.out.println(c3.getName()); //结果:Point
//运用.calss的方式获取Class实例(基本类型)
Class c4=int.calss;
System.out.println(c4.getName()); //结果:int
//运用.calss的方式获取Class实例(基本数据类型的封装类)
Class c5=Integer.TYPE;
System.out.println(c5.getName()); //结果:int
Class c6=Integer.class;
System.out.println(c6.getName()); //结果:java.lang.Integer
*/
//以下结果是: before new Point()
loading point
after new Point()
loading Line
//当new Point()的时候加载这个类,用forName构造实例的时候也加载该类。
System.out.println("before new Point()");
new Point();
System.out.println("after new Point()");
try
{
Class.forName("Line");
}catch(Exception e)
{
e.printStackTrace();
}
}
}
class Point()
{
static
{
System.out.println("loading point");
}
int x,y;
}
class Line
{
static
{
System.out.println("loading Line");
}
}
在运行期间,如果我们要产生某个类的对象,java虚拟机会检测该类型的Class对象是否已被加载。如果没有加载,java虚拟机会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已经被加载到内存,就可以用它来产生该类型的所有对象。
newInstance()调用内中缺省的构造方法。
newInstance()调用类中缺省的构造方法,如果要实例的对象中有了自己定义的构造方法(除重写的和默认构造方法相同的构造方法外)
创建此 Class 对象所表示的类的一个新实例
class ClassTest
{
public static void main(String[] args)
{
if(args.length!=1)
{
System.out.println("args.length!=1");
return;
}
try
{
Class c=Class.forName(args[0]);
Point pt=(Point)c.newInstance();
pt.output();
}catch(Exception e)
{
e.printStackTrace();
}
}
}
class Point
{
int x;
int y;
static
{
System.out.println("Loading point");
}
void output()
{
System.out.println("x="+x+",y="+y);
}
}
当我们在命令提示符下面编译好该类之后,输入java ClassTest Point的时候,此时会输出Loading point和x=0,y=0
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()是一样的。是没有任何意义的。
发表评论
-
jxl导出excel
2011-07-05 17:34 1384Java代码 package com.xinli; ... -
生成excel表格
2011-07-05 17:13 1164导出Excel表格的类 import java.io.File ... -
Ext动态树加载问题
2010-02-03 14:07 1749最近弄了个Ext动态加载树的Demo,有点小问题.请教下各位. ... -
Ext 树级联选中子节点
2010-02-02 16:05 3211var treePanel = new Ext.tree.Tr ... -
subtree
2010-02-02 11:09 1638在Faceye基础版(开源)中,使用了大量的树结构,比如台台管 ... -
subtreepanel
2010-02-02 11:07 1123Ext.namespace("www.haohao. ... -
com.sun.crypto.provider.SunJCE
2010-02-01 13:37 8189Could not instantiate bean clas ... -
利用poi操作word文档
2010-01-13 09:26 42016关键字:POI JAVA 批注 总页数 总字符数 一:认识PO ... -
POI 之二 poi操作解析word
2010-01-13 09:11 5238POI是Apache的一个开源项目,可以到Apache网站下载 ... -
POI 之一
2010-01-12 17:31 1468poi 新手教程 Jakarta_POI 使用Java读写Ex ... -
java 生成xml文件
2010-01-12 13:40 1199package com.xh.xml; import ja ... -
javascript 应用
2009-10-10 11:32 937/* * 打开新窗口 * f:链接地址 * n:窗口的名 ... -
端口查询
2009-08-02 09:13 2383在Windows 2000/XP/Server 2003中要查 ... -
Eclipse插件
2009-07-24 11:40 13771 EMF,GEF - Graphical Edito ... -
spring简单的下例子
2009-07-24 11:24 1210创建一个studentJavaBean public clas ... -
ssh整合报错
2009-07-23 17:29 21052009-07-23 17:24:02,343 DEBUG [ ... -
MyEclipse中连接Oracle中文版的时候报sql level1的错误
2009-07-23 10:12 1111打开MyEclipse的配置文件 把 英文的en替换成zh就 ... -
如何在eclipse中添加配置文件dtd描述
2009-07-22 12:13 4011手动增加spring配置文件的DTD描述 使用myeclips ... -
双系统grub引导出错
2009-07-22 11:18 1329现在的Linux安装程序都可以在安装grub时加入window ... -
Spring error
2009-07-20 15:29 1803Exception in thread "main& ...
相关推荐
ClassLoader主要关注的是加载阶段,它根据全限定名(如"java.lang.String")找到对应的.class文件,并将其转换为Class对象。Java提供了三个基础类加载器:Bootstrap ClassLoader、Extension ClassLoader和...
它的主要职责是根据类的全名(包括包名)找到对应的`.class`文件,并将其转换为字节码,然后加载到JVM中。Java的动态加载机制使得我们可以在运行时加载和卸载类,这是Java平台的一大特点。 在`ClassLoader`的层次...
1. **Bootstrap ClassLoader** 的搜索路径由`System.getProperty("sun.boot.class.path")`指定,通常包含了JVM的核心类库。 2. **Extension ClassLoader** 的搜索路径由`System.getProperty("java.ext.dirs")`指定,...
在Java编程语言中,`Classloader`(类加载器)是一个至关重要的组件,它负责将类的`.class`文件从磁盘加载到JVM(Java虚拟机)内存中,使得程序能够执行。这篇博文主要围绕`Classloader`的`loadClass`方法进行深入...
3. System ClassLoader(也称为AppClassLoader):加载`CLASSPATH`环境变量指定的类,以及应用主类路径(class path)上的类。 4. WebLogic特定的ClassLoaders: - Ear ClassLoader:加载EAR应用的全局库(如lib...
创建自定义Classloader需要继承java.lang.ClassLoader类,并重写其关键方法,如`findClass(String name)`或`loadClass(String name)`。这两个方法分别用于查找指定类的字节码和实际加载类。在`findClass`中,我们...
4. **使用`defineClass`方法定义类**:当输入流不为空时,使用`ClassLoader`的`defineClass`方法将字节数组转换为`Class`对象。 5. **实例化类**:通过`myLoader.loadClass(...
3. 如果类还未加载,ClassLoader会在指定的路径(例如类路径,classpath)下寻找对应的.class文件。 4. 找到类文件后,ClassLoader读取文件内容并将其转换为字节码。 5. 接下来,字节码会被验证确保符合Java语言规范...
在这个项目中,我们可以创建一个新的ClassLoader类,覆盖其`loadClass()`方法,实现我们的加载逻辑。我们可能需要读取自定义的位置(比如本地文件系统、网络或数据库)来获取类的字节码,然后使用`defineClass()`...
- 自定义ClassLoader通常需要重写`loadClass()`方法,该方法在找不到类时调用`findClass()`进行实际的加载操作。 - 在`ClassLoaderDemo`这个例子中,可能就展示了如何创建一个自定义的ClassLoader,从非标准位置...
在自定义ClassLoader时,主要需要覆写两个关键方法:`findClass()` 和 `loadClass()`。`loadClass()` 方法通常用于委托父类加载器加载类,如果父类加载器无法加载,再由当前类加载器尝试加载。`findClass()` 方法则...
破解java加密的ClassLoader.java,在classloader植入破解代码
自定义ClassLoader需要继承`java.lang.ClassLoader`类,并重写`findClass()`或`loadClass()`方法。通过这两个方法,你可以控制类的加载来源和方式。 在实际开发中,理解ClassLoader机制可以帮助解决一些问题,例如...
自定义ClassLoader通常需要重写findClass()或loadClass()方法,以控制类的加载行为。 理解ClassLoader的工作原理对于排查类冲突、处理依赖关系以及优化大型J2EE应用的性能具有重要意义。开发者可以通过日志输出、...
ClassLoader是JVM中的一个重要组件,它的主要任务是加载类的二进制数据,转换为Class对象,并供Java应用程序使用。本文将深入浅出地探讨JVM ClassLoader的工作原理和相关知识点。 首先,ClassLoader可以分为三种...
Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...
1. **加载**:加载是ClassLoader工作的起点,它从文件系统或网络中找到类的二进制数据,然后创建一个对应的Class对象。这个过程可以通过自定义ClassLoader来实现,比如从数据库中加载类。 2. **验证**:验证是确保...