关于通过类名访问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();
- }
第三种:通过类名.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);
//
前面已经初始化此处不用再初始化
} }