您的位置:首页 > 移动开发 > Objective-C

Object源码研究2——getClass()方法分析

2015-08-07 15:40 513 查看
1. 关于getClass()方法?

getClass()往往用于动态获得Class,可以运行如下代码进行检验

/**
* @author lcx
*
*/
public class MainTest {

public static void main(String[] args) {
Father son1=new Son1();
Father son2=new Son2();
System.out.println(Father.class);
readClass(son1);
readClass(son2);
}

public static void readClass(Father f)
{
System.out.println(f.getClass());
}
}

class Son1 extends Father
{

}

class Son2 extends Father
{

}

class Father
{

}


结果如下:

class Father

class Son1

class Son2

追问: 还有什么方法来获取class?

class.forName与.class当然都是静态的

追问: 我在哪用到过getClass方法?

有的地方比如equals判断,需要先检查class

追问: Class.forName()在哪用到?

事实上,

A a = (A)Class.forName("pacage.A").newInstance(); 这和A
a = new A();
是一样的。实际上在JVM中,这两种情况分别对应的是显示加载与隐式加载A类所对应的Class对象,当然,第一种情况只能对应无参构造器且效率较低。

追问:为什么使用JDBC时候需要Class.forName("com.mysql.jdbc.Driver");


因为后面DriverManager.getConnection()方法需要Driver加载到JVM中并进行初始化

追问:怎么样证明Class.forName速度更慢?

public class MainTest {

public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {

long t1=System.currentTimeMillis();
for(int i=0;i<10000;i++)
new MainTest();
long t2=System.currentTimeMillis();
for(int i=0;i<10000;i++)
Class.forName("MainTest").newInstance();
long t3=System.currentTimeMillis();
System.out.println(t2-t1);
System.out.println(t3-t2);
}

}


打印结果为

1

20
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: