Class.forName()详细介绍
cookqq ›博客列表 ›jvm

Class.forName()详细介绍

2013-05-21 11:41:48.0|分类: jvm|浏览量: 1538

摘要: Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。调用 forName("X") 将导致命名为 X 的类被初始化。 </...

Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。调用 forName("X") 将导致命名为 X 的类被初始化。


package com.java.jvm;

public class ClassTest {
	 public  static void main(String[] arg){ 
		 try {
			 Class  userClass = Class.forName("com.java.jvm.User");
			 System.out.println("userClass="+userClass);
			 User user = (User) userClass.newInstance();
			 System.out.println("user="+user);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	  } 
}
打印结果:



userClass=class com.java.jvm.User
user=User [name=null, age=null, address=null]
 Class.forName("")返回的是类(Class)
 Class.forName("").newInstance()返回的是object 其实和new 的关键字作用相同。


调用 forName("X") 将导致命名为 X 的类被初始化,这句话是官网API上的一句话,很迷茫,有点不理解,所以在User类中,添加了static语句块和User构造函数


package com.java.jvm;

public class User {
	
	static{
		System.out.println("static ---");
	}
	
	public User(){
		System.out.println("name="+name);
		name="xiaotian";
	}
	
	private String name;
	private Integer age;
	private String address;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", address=" + address
				+ "]";
	}
	
}
结果打印:
static ---
userClass=class com.java.jvm.User
name=null
user=User [name=xiaotian, age=null, address=null]


forName("X") 执行的时候,调用了User中的静态语句块,newInstance()执行的时候调用了构造函数。

连接数据库的简单代码


// 驱动程序名
           String driver = "com.mysql.jdbc.Driver";

           // URL指向要访问的数据库名student
           String url = "jdbc:mysql://127.0.0.1:3306/student";

           // MySQL配置时的用户名
           String user = "root"; 

           // MySQL配置时的密码
           String password = "root";

           try { 
            // 加载驱动程序
            Class.forName(driver);

            // 连续数据库
            Connection conn = DriverManager.getConnection(url, user, password);

            if(!conn.isClosed()) 
             System.out.println("Succeeded connecting to the Database!");

            // statement用来执行SQL语句
            Statement statement = conn.createStatement();

            // 要执行的SQL语句
            String sql = "select * from student";

            // 结果集
            ResultSet rs = statement.executeQuery(sql);
其中加载数据库驱动
Class.forName(driver);加载mysql驱动,执行static语句块,使将Driver对象注册到DriverManager中,然后上面就获得了数据库连接


package com.mysql.jdbc   
 
public class Driver extends NonRegisteringDriver implements java.sql.Driver {   
// ~ Static fields/initializers   
// --------------------------------------------- //   A
// Register ourselves with the DriverManager   
//   
static {   
     t ry {   //使将Driver对象注册到DriverManager中
               java.sql.DriverManager.registerDriver(new Driver());   
           } catch (SQLException E) {   
              throw new RuntimeException("Can't register driver!");   
           }   
   }   
// ~ Constructors   
// -----------------------------------------------------------   
/**
   * Construct a new driver and register it with DriverManager
   *
   * @throws SQLException
   *              if a database error occurs.
   */  
public Driver() throws SQLException {   
     // Required for Class.forName().newInstance()   
}   
}








一键分享文章

分类列表

  • • struts源码分析
  • • flink
  • • struts
  • • redis
  • • kafka
  • • ubuntu
  • • zookeeper
  • • hadoop
  • • activiti
  • • linux
  • • 成长
  • • NIO
  • • 关键词提取
  • • mysql
  • • android studio
  • • zabbix
  • • 云计算
  • • mahout
  • • jmeter
  • • hive
  • • ActiveMQ
  • • lucene
  • • MongoDB
  • • netty
  • • flume
  • • 我遇到的问题
  • • GRUB
  • • nginx
  • • 大家好的文章
  • • android
  • • tomcat
  • • Python
  • • luke
  • • android源码编译
  • • 安全
  • • MPAndroidChart
  • • swing
  • • POI
  • • powerdesigner
  • • jquery
  • • html
  • • java
  • • eclipse
  • • shell
  • • jvm
  • • highcharts
  • • 设计模式
  • • 列式数据库
  • • spring cloud
  • • docker+node.js+zookeeper构建微服务
版权所有 cookqq 感谢访问 支持开源 京ICP备15030920号
CopyRight 2015-2018 cookqq.com All Right Reserved.