小菜总结到
大家都知道Object类有一个getClass()方法 打开API看看它是这样说的
返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
返回:表示此对象运行时类的 Class 对象。
疑问来了 返回此Object的运行时类 它这里Object运行时类指那个类? 什么又是运行时类的Class对象 它到底是啥对象?
来点代码吧 我们这里有两个类 Test类测试用的 还有一个Never类
Never类
Test类
猜猜会输出什么? 。。。。。。。。
输出
到这里只能说明一个问题我们调用一个对象的getClass()方法会初始化这个类也就是执行static代码块 你可能会问这里的this指什么呢? 它指的那个对象呢?
答:是Object对象 其实你可以通过你的MyEclipse的自动代码提示功能看到 当你打点的时候会出来Object的许多方法
我们还是用代码来验证以下吧!下面我来改写main方法
输出结果是:
所以this指的是Object对象
接下来我们看这个main方法
输出结果:
这说明我们这句: Test test = this.getClass().newInstance(); 得到了一个Test对象 我们调用object.getClass()方法 返回一个Class对象
这个Class对象 和Test对象不同 然后我们调用newInstance()创建了一个实例
API 里边说返回运行时类的Class对象 其实就是说 当前运行这个类的Class对象(在你不指定对象的情况下)
java.lang.Class类里边有很多实用的方法 当你得到一个对象的Class对象之后就可以调用这些方法
这个类里边只要一个静态方法那就是forName("指定类名")其实它和getClass 的功能一样都会对一个类初始化都是返回一个对象的Class对象 只不过它的参数里边直接指定类名 注意这个参数 是完全限定类型鸟 得加上包名! 还有它是一个静态方法你可以直接 Class.forName()这样用方便些 如果你这样写:
效果和 this.getClass(); 一样只不过上边那种有点二
forName()方法还有一个重载方法
类似这种
第一个参数还是指定类名 第二个参数指定要不要初始化 第三个参数是指定类的加载器
我把第二参数改为false 就不会初始化Never这个类 也就不会执行静态代码块了!
大家都知道Object类有一个getClass()方法 打开API看看它是这样说的
返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
返回:表示此对象运行时类的 Class 对象。
疑问来了 返回此Object的运行时类 它这里Object运行时类指那个类? 什么又是运行时类的Class对象 它到底是啥对象?
来点代码吧 我们这里有两个类 Test类测试用的 还有一个Never类
Never类
- package woca;
- public class Never {
- static{
- System.out.println("Never类被初始化了");
- }
- public void shuChu(){
- System.out.println("Never类shuChu()方法执行");
- }
- }
Test类
- package woca;
- public class Test {
- static{
- System.out.println("Test类被初始化了");
- }
- public void testClass() throws Exception, Exception{
- this.getClass();
- }
- public void shuChu(){
- System.out.println("本类的Class对象");
- }
- public static void main(String[] args) throws Exception {
- Test t = new Test();
- t.testClass();
- }
- }
猜猜会输出什么? 。。。。。。。。
输出
- Test类被初始化了
答:是Object对象 其实你可以通过你的MyEclipse的自动代码提示功能看到 当你打点的时候会出来Object的许多方法
我们还是用代码来验证以下吧!下面我来改写main方法
- package woca;
- public class Test {
- static{
- System.out.println("Test类被初始化了");
- }
- public void testClass() throws Exception, Exception{
- Object ob = this.getClass().newInstance();
- if (ob instanceof Object) {
- System.out.println("ob是一个Object实例");
- }
- }
- public void shuChu(){
- System.out.println("本类的Class对象");
- }
- public static void main(String[] args) throws Exception {
- Test t = new Test();
- t.testClass();
- }
- }
输出结果是:
- Test类被初始化了
- ob是一个Object实例
所以this指的是Object对象
接下来我们看这个main方法
- package woca;
- public class Test {
- static{
- System.out.println("Test类被初始化了");
- }
- public void testClass() throws Exception, Exception{
- Test test = this.getClass().newInstance();
- test.shuChu();
- }
- public void shuChu(){
- System.out.println("本类的Class对象");
- }
- public static void main(String[] args) throws Exception {
- Test t = new Test();
- t.testClass();
- }
- }
输出结果:
- Test类被初始化了
- 本类的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()这样用方便些 如果你这样写:
- this.getClass().forName("woca.Test");
效果和 this.getClass(); 一样只不过上边那种有点二
forName()方法还有一个重载方法
类似这种
- Class.forName("woca.Never", false, this.getClass().getClassLoader());
第一个参数还是指定类名 第二个参数指定要不要初始化 第三个参数是指定类的加载器
我把第二参数改为false 就不会初始化Never这个类 也就不会执行静态代码块了!