关于Java中类名.class的基础介绍
2016-08-20 14:01
417 查看
原文 http://blog.csdn.net/u012453619/article/details/38638313
声明: 文章的总结,来自许多网友的优秀博客
关于通过类名访问class属性,我朋友过好几次了,一直没明白这个东西到底是什么?对此,我参照网友们的博客,总结了一些小知识,如发现错误,希望纠正,谢谢
其实任何一个类,都会有一个Class对象于这个类对应,在这个Class对象中,保存着实例化该类时所需要的基本信息,A.class 其实返回的是一个类A的Class对象,贴一个小代码演示一下:
获取Calss对象的方式
主要有三种:
第一种:通过Class.forName(“类的全名称”)获取,用这个方法,最常见的应该是应用于JDBC注册驱动的时候用到的
第二种:通过已经实例化的对象获取,getClass()方法获取
第三种:通过类名.class获取
还在网友博客上看到一段比较不错的代码:贴之
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值则要进行链接并对其所在类进行初始化。
声明: 文章的总结,来自许多网友的优秀博客
关于通过类名访问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值则要进行链接并对其所在类进行初始化。
相关文章推荐
- Android Native 绘图方法
- Java反射随记
- AS3中的反射(速记) 分析
- C#中struct和class的区别详解
- C# 反射(Reflection)的用处分析
- C#通过反射创建自定义泛型
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 通俗易懂的C#之反射教程
- C#根据反射和特性实现ORM映射实例分析
- 深入了解PHP类Class的概念
- 深入反射生成数组的详解
- C#利用反射来判断对象是否包含某个属性的实现方法
- C#利用反射技术实现去掉按钮选中时的边框效果
- C#泛型和反射实例解析
- C# Dynamic关键字之:dynamic为什么比反射快的详解
- jquery 表单验证之通过 class验证表单不为空
- setAttribute 与 class冲突解决
- JavaScript通过HTML的class来获取HTML元素的方法总结
- JavaScript中的类(Class)详细介绍