在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。
   这里有必要提一下就是Class下的newInstance()和new有什么区别?,首先,newInstance(
)是一个方法,而new是一个关键字,其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用
new关键字生成对象没有这个限制。
   好,到此为止,我们总结如下:
  
Class.forName("")返回的是类
  
Class.forName("").newInstance()返回的是object
  
有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用newInstance(
)方法呢?即有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一
些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?
  
刚才提到,Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码
段。而在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的
Driver类的代码都必须类似如下:

 public class MyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}

既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。

 
贴出Proxool 连接池的静态初始化方法:
 public class ProxoolDriver implements Driver {
private static final Log LOG = LogFactory.getLog(ProxoolDriver.class);
static {
try {
DriverManager.registerDriver(new ProxoolDriver());
} catch (SQLException e) {
System.out.println(e.toString());
}
}
}

1: Class cl=A.class;

JVM将使用类A的类装载器, 将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象。

2:Class cl=对象引用o.getClass();

返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象 。

3:Class.forName("类名");

.装入类A,并做类的初始化

.getClass()是动态的,其余是静态的。

.class和class.forName()只能返回类内field的默认值,getClass可以返回当前对象中field的最新值

Class.forName() 返回的是一个类,.newInstance() 后才创建一个对象,Class.forName()的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的

 public class Person {
private String name = "Alfira";
public void getName() {
System.out.println(name);
}
public void setName(String name, int a) {
this.name = name + a;
}
}
 import java.lang.reflect.Method;

 public class Test {

     /**
* @param args
*/
public static void main(String[] args) {
show("yerasel.Person");
} private static void show(String name) {
try {
// JVM将使用类A的类装载器,将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作
Class classtype3 = Person.class;
// 获得classtype中的方法
Method getMethod3 = classtype3.getMethod("getName", new Class[] {});
Class[] parameterTypes3 = { String.class, int.class };
Method setMethod3 = classtype3
.getMethod("setName", parameterTypes3); // 实例化对象,因为这一句才会输出“静态初始化”以及“初始化”
Object obj3 = classtype3.newInstance();
// 通过实例化后的对象调用方法
getMethod3.invoke(obj3); // 获取默认值
setMethod3.invoke(obj3, "Setting new ", 3); // 设置
getMethod3.invoke(obj3); // 获取最新
System.out.println("----------------"); // 返回运行时真正所指的对象
Person p = new Person();
Class classtype = p.getClass();// Class.forName(name);
// 获得classtype中的方法
Method getMethod = classtype.getMethod("getName", new Class[] {});
Class[] parameterTypes = { String.class, int.class };
Method setMethod = classtype.getMethod("setName", parameterTypes);
getMethod.invoke(p);// 获取默认值
setMethod.invoke(p, "Setting new ", 1); // 设置
getMethod.invoke(p);// 获取最新
System.out.println("----------------"); // 装入类,并做类的初始化
Class classtype2 = Class.forName(name);
// 获得classtype中的方法
Method getMethod2 = classtype2.getMethod("getName", new Class[] {});
Class[] parameterTypes2 = { String.class, int.class };
Method setMethod2 = classtype2
.getMethod("setName", parameterTypes2);
// 实例化对象
Object obj2 = classtype2.newInstance();
// 通过实例化后的对象调用方法
getMethod2.invoke(obj2); // 获取默认值
setMethod2.invoke(obj2, "Setting new ", 2); // 设置
getMethod2.invoke(obj2); // 获取最新 System.out.println("----------------"); } catch (Exception e) {
System.out.println(e);
}
}
}

Class.forName(),Class.forName().newInstance() ,New ,类名.class,,class.forName(),,getClass()的更多相关文章

  1. java中Class对象详解和类名.class, class.forName(), getClass()区别

    一直在想.class和.getClass()的区别,思索良久,有点思绪,然后有网上搜了搜,找到了如下的一篇文章,与大家分享. 原来为就是涉及到Java的反射----- Java反射学习 所谓反射,可以 ...

  2. java 类名.class、object.getClass()和Class.forName()的区别 精析

        1.介绍 getClass()介绍 java是面向对象语言,即万物皆对象,所有的对象都直接或间接继承自Object类: Object类中有getClass()方法,通过这个方法就可以获得一个实 ...

  3. Java中Class.forName()用法和newInstance()方法详解

    1.Class.forName()主要功能 Class.forName(xxx.xx.xx)返回的是一个类, Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就 ...

  4. 【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别

    Class对象的生成方式如下: 1.类名.class           说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Cla ...

  5. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  6. 类名.class, class.forName(), getClass()区别

    1:Class cl=A.class; JVM将使用类A的类装载器, 将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象. 2:Class cl=对象引 ...

  7. java中类名.class, class.forName(), getClass()区别

    Class对象的生成方式如下: 1.类名.class           说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Cla ...

  8. java反射中Class对象详解和类名.class, class.forName(), getClass()区别

    1.获得类型类 可以看到,对象a是A的一个实例,A是某一个类,在if语句中使用a.getClass()返回的结果正是类A的类型类,在Java中表示一个特定类型的类型类可以用“类型.class”的方式获 ...

  9. java中类名.class、实例.getclass()区别

    import java.util.HashSet; import java.util.Iterator; /** * Created by GOD on 2016/1/23. * Class对象的生成 ...

  10. JDBC-java访问数据库

    定义:JDBC是一个独立于数据库管理系统的,通用的SQL数据库存取和操作的公共接口 (由JAVA类和接口组成,接口由各数据库厂家负责实现) 使用方法: 1.加载驱动 Class.forName(&qu ...

随机推荐

  1. Ansible Ad-Hoc命令

    -a:传入模块的参数,不同的模块要传入的参数不同 -B SECOND:当任务放到后台执行异步任务,设置程序运行的超时时间,传入的是一个数值,单位秒 -C:测试该任务能否正常运行,不对被管理主机做出任何 ...

  2. 发展科技到底有什么用,转NASA专家给一位修女的一封信

    问题补充:我们难道不应该把这些资金用于更深入的医疗保障和减少贫穷吗? 我们为何要仰望星空,花大量的金钱和精力探索那不可预知的宇宙呢?NASA科学家写给非洲修女的一封信回答得特别好,也特别震撼人心.—— ...

  3. Spring Boot 2 实践记录之 组合注解原理

    Spring 的组合注解功能,网上有很多文章介绍,不过都是介绍其使用方法,鲜有其原理解析. 组合注解并非 Java 的原生能力.就是说,想通过用「注解A」来注解「注解B」,再用「注解B」 来注解 C( ...

  4. vs2017 修改项目名称

    由于经常接到各种项目需求, 又不想重新搭建框架. 于是便想到直接修改项目名. 话不多说, 上图~ 1 重命名 解决方案 和  项目名称 2 重命名项目的应用程序名和命名空间 3 Ctrl+F 将旧的工 ...

  5. item style edit in sharepoint 2013

    标题头添加属性:(如果需要使用ddwrt)xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime&quo ...

  6. 【cocos2d-x 手游研发小技巧(6)聊天系统+字体高亮】

    转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2dxJQ-6.html 聊天系统在手机网游中是最常见的交互工具,大家在一起边玩游戏边聊天岂不乐哉: 废话不多了 ...

  7. mysql enterprise backup入门使用

    **************************************************************--1.全备******************************** ...

  8. SpringBoot程序远程debug

    所谓的远程调试就是服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内 ...

  9. C#使用 RNGCryptoServiceProvider 生成强随机字符串

    为了生成更加可靠的随机数,微软在System.Security.Cryptography命名空间下提供一个名为system.Security.Cryptography.RNGCryptoService ...

  10. 安装vue后报错 bash: vue: command not found

    今天参照之前写的vue的环境搭建一个新的项目  http://www.cnblogs.com/stella1024/p/7570884.html 安装完vue,并提示成功: $ npm install ...