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

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

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

[java]  view plain  copy
  1. public class Test {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         // 得到类名(不包含包名)  
  9.         System.out.println(String.class.getSimpleName());// String  
  10.         // 得到类的全名称(包含所在的包名)  
  11.         System.out.println(String.class.getName());// java.lang.String  
  12.         System.out.println(Test.class.getName());// Test  
  13.     }  
  14. }  

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

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

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

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

[java]  view plain  copy
  1. public class Test {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         Test test = new Test();  
  9.         System.out.println(test.getClass());// class Test  
  10.         System.out.println(Test.class);// class Test  
  11.     }  
  12. }  
还在网友博客上看到一段比较不错的代码:贴之

 
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值则要进行链接并对其所在类进行初始化。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值