getClass

小菜总结到 
    大家都知道Object类有一个getClass()方法 打开API看看它是这样说的 

返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。 
返回:表示此对象运行时类的 Class 对象。
 
  疑问来了 返回此Object的运行时类 它这里Object运行时类指那个类? 什么又是运行时类的Class对象 它到底是啥对象? 
  来点代码吧 我们这里有两个类 Test类测试用的 还有一个Never类 
Never类 
Java代码   收藏代码
  1. package woca;  
  2.   
  3. public class Never {  
  4.       static{  
  5.           System.out.println("Never类被初始化了");  
  6.       }  
  7.       public void shuChu(){  
  8.           System.out.println("Never类shuChu()方法执行");  
  9.       }  
  10. }  


  Test类 
Java代码   收藏代码
  1. package woca;  
  2.   
  3. public class Test {  
  4.     static{  
  5.         System.out.println("Test类被初始化了");  
  6.     }  
  7.     public void testClass() throws Exception, Exception{  
  8.         this.getClass();  
  9.     }  
  10.       
  11.     public void shuChu(){  
  12.         System.out.println("本类的Class对象");  
  13.     }  
  14.       
  15.     public static void main(String[] args) throws Exception {  
  16.         Test t = new Test();  
  17.         t.testClass();  
  18.     }  
  19. }  

猜猜会输出什么? 。。。。。。。。 
输出
Java代码   收藏代码
  1. Test类被初始化了  
到这里只能说明一个问题我们调用一个对象的getClass()方法会初始化这个类也就是执行static代码块  你可能会问这里的this指什么呢?  它指的那个对象呢? 
答:是Object对象 其实你可以通过你的MyEclipse的自动代码提示功能看到 当你打点的时候会出来Object的许多方法 
我们还是用代码来验证以下吧!下面我来改写main方法 
Java代码   收藏代码
  1. package woca;  
  2.   
  3. public class Test {  
  4.     static{  
  5.         System.out.println("Test类被初始化了");  
  6.     }  
  7.     public void testClass() throws Exception, Exception{  
  8.          Object ob = this.getClass().newInstance();  
  9.         if (ob instanceof Object) {  
  10.             System.out.println("ob是一个Object实例");  
  11.               
  12.         }  
  13.     }  
  14.       
  15.     public void shuChu(){  
  16.         System.out.println("本类的Class对象");  
  17.     }  
  18.       
  19.     public static void main(String[] args) throws Exception {  
  20.         Test t = new Test();  
  21.         t.testClass();  
  22.     }  
  23. }  

输出结果是: 
Java代码   收藏代码
  1. Test类被初始化了  
  2. ob是一个Object实例  

所以this指的是Object对象 

接下来我们看这个main方法 
Java代码   收藏代码
  1. package woca;  
  2.   
  3. public class Test {  
  4.     static{  
  5.         System.out.println("Test类被初始化了");  
  6.     }  
  7.     public void testClass() throws Exception, Exception{  
  8.         Test test = this.getClass().newInstance();  
  9.         test.shuChu();  
  10.     }  
  11.       
  12.     public void shuChu(){  
  13.         System.out.println("本类的Class对象");  
  14.     }  
  15.       
  16.     public static void main(String[] args) throws Exception {  
  17.         Test t = new Test();  
  18.         t.testClass();  
  19.           
  20.     }  
  21. }  

输出结果: 
Java代码   收藏代码
  1. Test类被初始化了  
  2. 本类的Class对象  

这说明我们这句: Test test = this.getClass().newInstance(); 得到了一个Test对象  我们调用object.getClass()方法 返回一个Class对象 
这个Class对象 和Test对象不同 然后我们调用newInstance()创建了一个实例 
API 里边说返回运行时类的Class对象 其实就是说 当前运行这个类的Class对象(在你不指定对象的情况下) 
java.lang.Class类里边有很多实用的方法 当你得到一个对象的Class对象之后就可以调用这些方法 
这个类里边只要一个静态方法那就是forName("指定类名")其实它和getClass 的功能一样都会对一个类初始化都是返回一个对象的Class对象 只不过它的参数里边直接指定类名  注意这个参数 是完全限定类型鸟 得加上包名! 还有它是一个静态方法你可以直接 Class.forName()这样用方便些 如果你这样写:
Java代码   收藏代码
  1. this.getClass().forName("woca.Test");  

效果和 this.getClass(); 一样只不过上边那种有点二 
forName()方法还有一个重载方法 
类似这种
Java代码   收藏代码
  1. Class.forName("woca.Never"falsethis.getClass().getClassLoader());  

  第一个参数还是指定类名 第二个参数指定要不要初始化 第三个参数是指定类的加载器 
我把第二参数改为false 就不会初始化Never这个类 也就不会执行静态代码块了!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值