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