在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类的代码都必须类似如下:
这里有必要提一下就是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类的代码都必须类似如下:
1 public class MyJDBCDriver implements Driver { 2 static { 3 DriverManager.registerDriver(new MyJDBCDriver()); 4 } 5 }
既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。
贴出Proxool 连接池的静态初始化方法:
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会执行该类的
相关推荐
我们可以使用class literal来获取类的元数据,如类名、接口实现、父类等,也可以用于创建类的新实例(通过`newInstance()`方法,前提是该类有无参构造器)。 接着,我们讨论 "instance.getClass()"。这个方法是每个...
- **创建方式**:`new`直接创建对象,而`forName()`和`newInstance()`则通过类加载机制创建对象,提供了更多的灵活性,如在运行时根据配置或条件创建不同类型的对象。 此外,`Class.forName()`方法还有其他重载形式...
在Java编程语言中,`Class.forName()`方法是一个非常重要的功能,它主要用于动态加载类到Java虚拟机(JVM)中。这个方法的主要作用是根据给定的全限定类名(包括包名和类名)来查找并加载对应的类。下面我们将深入...
`Class.forName` 经常与 `newInstance` 方法配合使用,以实现动态创建对象的目的。`newInstance` 方法用于创建 `Class` 对象所表示的类的实例。 **示例**: ```java try { Class<?> clazz = Class.forName(...
在“forname实现工程内部反射机制”这个主题中,我们将深入探讨如何利用`Class.forName()`方法来实现对工程内部类的动态访问。 首先,让我们了解`Class.forName()`的基本用法。这个方法接收一个字符串参数,该参数...
首先,我们从`Class.forName()`方法开始。这是Java反射机制的一个关键入口点,它用于根据全限定类名(包括包名)加载类。例如,如果我们有一个名为`Robot`的类,我们可以使用以下代码加载它: ```java Class<?> ...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String user = "test"; String password = "test"; Connection conn = ...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; Connection conn = DriverManager.getConnection(url, user, password); ``` 这里,`...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; String user="test"; String password="test"; Connection conn= DriverManager.get...
在上述代码中,`Class.forName()`用于加载类,`getConstructor()`和`newInstance()`用于获取并实例化对象,`getMethod()`和`invoke()`用于调用方法。 **简单工厂模式** 简单工厂模式是一种创建型设计模式,它定义了...
Object obj = clazz.newInstance(); System.out.println(obj.getClass().getName()); // 输出:org.whatisjava.reflect.Foo } catch (ClassNotFoundException | InstantiationException | IllegalAccessException...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; String user="test"; String password="test"; Connection conn= DriverManager.get...
- 使用类名加`.class`的方式,例如`String.class`。 - 通过对象的`getClass()`方法,例如`new String().getClass()`。 - 使用`Class.forName("类的全限定名")`,例如`Class.forName("java.lang.String")`。 #### 二...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl 是数据库的服务标识符(SID) String user = "test"; String password = ...
Class.forName(Driver).newInstance(); // 加载驱动 Connection con = DriverManager.getConnection(URL, Username, Password); // 建立连接 ``` #### 2. **Microsoft SQL Server** 针对Microsoft SQL Server,...
Field[] fields = Customer.class.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); String fieldName = field.getName(); Object value = resultSet.getObject(fieldName); ...
Object o = m.invoke(Class.forName("com.Test").newInstance(), new Object[]{new Integer(10)}); System.out.println(o); } catch (Exception e) { e.printStackTrace(); } } } ``` - **核心方法**: - `...
2. 直接通过“类名.class”来获取。如: ```java Class<?> clazz = java.util.Date.class; ``` 这种方式不需要实例化对象,直接获取类的`Class`对象。 3. 调用`Class`类的静态方法`forName(String className)`。...
1. **通过类名**:直接使用类名后加上`.class`的方式获得。 ```java Class clazz = Person.class; ``` 2. **通过对象的`getClass()`方法**:如果已经有一个该类的对象实例,可以通过调用其`getClass()`方法来...
例如,如果类有一个无参数构造函数,我们可以使用`newInstance()`方法来创建对象。 **示例代码片段**: ```java public class HelloWorld { public static void main(String[] args) { try { Class<?> person...