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

来源:互联网 发布:单片机无线抢答器 编辑:程序博客网 时间:2024/06/07 16:10

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







0 0
原创粉丝点击