Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。调用 forName("X") 将导致命名为 X 的类被初始化。
01package com.java.jvm;
02
03public class ClassTest {
04public static void main(String[] arg){
05try {
06Class userClass = Class.forName("com.java.jvm.User");
07System.out.println("userClass="+userClass);
08User user = (User) userClass.newInstance();
09System.out.println("user="+user);
10}catch (ClassNotFoundException e) {
11e.printStackTrace();
12}catch (InstantiationException e) {
13e.printStackTrace();
14}catch (IllegalAccessException e) {
15e.printStackTrace();
16}
17}
18} 打印结果:
1userClass=class com.java.jvm.User
2user=User [name=null, age=null, address=null]
Class.forName("")返回的是类(Class)
Class.forName("").newInstance()返回的是object其实和new 的关键字作用相同。
调用 forName("X") 将导致命名为 X 的类被初始化,这句话是官网API上的一句话,很迷茫,有点不理解,所以在User类中,添加了static语句块和User构造函数
01package com.java.jvm;
02
03public class User {
04
05static{
06System.out.println("static ---");
07}
08
09public User(){
10System.out.println("name="+name);
11name="xiaotian";
12}
13
14private String name;
15private Integer age;
16private String address;
17
18public String getName() {
19return name;
20}
21public void setName(String name) {
22this.name = name;
23}
24public Integer getAge() {
25return age;
26}
27public void setAge(Integer age) {
28this.age = age;
29}
30public String getAddress() {
31return address;
32}
33public void setAddress(String address) {
34this.address = address;
35}
36@Override
37public String toString() {
38return "User [name=" + name +", age=" + age +", address=" + address
39+"]";
40}
41
42} 结果打印:
1static ---
2userClass=class com.java.jvm.User
3name=null
4user=User [name=xiaotian, age=null, address=null]
forName("X")执行的时候,调用了User中的静态语句块,newInstance()执行的时候调用了构造函数。
连接数据库的简单代码
01// 驱动程序名
02String driver ="com.mysql.jdbc.Driver";
03
04// URL指向要访问的数据库名student
05String url ="jdbc:mysql://127.0.0.1:3306/student";
06
07// MySQL配置时的用户名
08String user ="root";
09
10// MySQL配置时的密码
11String password ="root";
12
13try {
14// 加载驱动程序
15Class.forName(driver);
16
17// 连续数据库
18Connection conn = DriverManager.getConnection(url, user, password);
19
20if(!conn.isClosed())
21System.out.println("Succeeded connecting to the Database!");
22
23// statement用来执行SQL语句
24Statement statement = conn.createStatement();
25
26// 要执行的SQL语句
27String sql ="select * from student";
28
29// 结果集
30ResultSet rs = statement.executeQuery(sql); 其中加载数据库驱动
Class.forName(driver);加载mysql驱动,执行static语句块,使将Driver对象注册到DriverManager中,然后上面就获得了数据库连接
01package com.mysql.jdbc
02
03public class Driverextends NonRegisteringDriverimplements java.sql.Driver {
04// ~ Static fields/initializers
05// --------------------------------------------- // A
06// Register ourselves with the DriverManager
07//
08static {
09t ry {//使将Driver对象注册到DriverManager中
10java.sql.DriverManager.registerDriver(new Driver());
11}catch (SQLException E) {
12throw new RuntimeException("Can't register driver!");
13}
14}
15// ~ Constructors
16// -----------------------------------------------------------
17/**
18* Construct a new driver and register it with DriverManager
19*
20* @throws SQLException
21* if a database error occurs.
22*/
23public Driver()throws SQLException {
24// Required for Class.forName().newInstance()
25}
26}