Object源码研究2——getClass()方法分析
2015-08-07 15:40
513 查看
1. 关于getClass()方法?
getClass()往往用于动态获得Class,可以运行如下代码进行检验
结果如下:
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速度更慢?
打印结果为
1
20
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
相关文章推荐
- 关于AVFoundation播放没有声音的解决办法
- Objective-C zip中ioapi_buf.c报错
- iOS混合编程之使用Swift+Objective-C调用WebService
- objective-c 中随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )
- [转] When exactly does the virtual table pointer (in C++) gets set for an object?
- Object源码研究1——整体研究
- ==、hashCode()、equals(Object obj)方法
- *Delphi控件之---通过编码学习TStringGrid(也会涉及到Panel控件,还有对Object Inspector的控件Events的介绍
- Volley的Get、Post方式(JsonObjectRequest、StringRequest)以及Volley获取图片的3种方式
- 《Objective-C基础教程》第四章 继承
- object-c 不定参数的遍历和原理
- Swift和Objective-C混合编程——OC调用Swift
- *Delphi控件之---UpDown以及其与TEdit的配合使用(比如限制TEdit只能输入数字,还有Object Inspector之组件属性的介绍)
- 使用JMS发送和接收text和Object类型的消息
- Linq to object 技巧、用法集锦
- Swift和Objective-C混合编程——Swift调用OC
- objective-c 中随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )
- Objective-C基础语法快速入门
- 用 Objective-C 编程:定义一个类
- Objective-C基调(4)Category