首页 > 代码库 > 关于Java中类名.class的基础介绍

关于Java中类名.class的基础介绍

声明:文章的总结,来自许多网友的优秀博客

关于通过类名访问class属性,我朋友过好几次了,一直没明白这个东西到底是什么?对此,我参照网友们的博客,总结了一些小知识,如发现错误,希望纠正,谢谢

其实任何一个类,都会有一个Class对象于这个类对应,在这个Class对象中,保存着实例化该类时所需要的基本信息,A.class  其实返回的是一个类A的Class对象,贴一个小代码演示一下:

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 得到类名(不包含包名)
		System.out.println(String.class.getSimpleName());// String
		// 得到类的全名称(包含所在的包名)
		System.out.println(String.class.getName());// java.lang.String
		System.out.println(Test.class.getName());// Test
	}
}

获取Calss对象的方式主要有三种:

第一种:通过Class.forName(“类的全名称”)获取,用这个方法,最常见的应该是应用于JDBC注册驱动的时候用到的

try {
		Class.forName("oracle.jdbc.driver.OracleDriver");// 注册驱动
} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
}
第二种:通过已经实例化的对象获取,getClass()方法获取

第三种:通过类名.class获取

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test test = new Test();
		System.out.println(test.getClass());// class Test
		System.out.println(Test.class);// class Test
	}
}
还在网友博客上看到一段比较不错的代码:贴之

import java.util.*;   class Initable{   static final int staticFinal = 47;   static final int staticFinal2 = ClassInitialization.rand.nextInt(100);   static{   System.out.println("Initialization Initable");   }   }   class Initable2{   static int staticNoFinal = 147;   static{   System.out.println("Initialization Initable2");   }   }   class Initable3{   static int staticNoFinal = 74;   static{   System.out.println("Initialization Initable3");   }   }   public class ClassInitialization   {   public static Random rand = new Randdom(47);   public static void main(String[] args){   Class initable = Initable.class; //不会引起初始化   System.out.println("after creating Initable reference");   System.out.println(Initable.staticFinal); //引用编译器常量不会引起初始化   System.out.println(Initable.staticFinal2); //引起初始化   System.out.println(Initable2.staticNoFinal); //引用非编译期常量会引起初始化   Class initable3 = Class.forName("Initable3"); //默认会引起初始化   System.out.println("after creating Initable3 reference");   System.out.println(Initable3.staticNoFinal);//前面已经初始化此处不用再初始化   }   }
        如果一个static final值是编译期常量,那么对该值的引用无需对其所在类进行初始化;若仅仅是static和final但不是编译期常量,则会引发初始化其类。若是引用一个static值则要进行链接并对其所在类进行初始化。