您的位置:首页 > 编程语言 > Java开发

【java】深入理解getClass()

2016-12-27 20:56 190 查看
之所以标题写的是深入理解,主要是为了让更多人能够惯性思维的以为我这个是一篇好文。事情的真相是我只是为了和网络上面很多抄来抄去的做一下区分而已,自己遇到这个问题的时候,也是百度、google,发现很多文章都是一样的,很多细节性的错误暗示作者可能连起码的代码都没有运行。我自己相比于他们多的就是多看几篇,多运行几遍代码,然后整理一下思路,主要目的是为了将来自己忘记了再回过来看的时候能够一目了然,这也是我写记录博客的出发点。

首先看一段代码:

package concreteHandler;

import java.util.GregorianCalendar;

public class ObjectDemo {
public static void main(String[] args) {

// create a new ObjectDemo object
GregorianCalendar cal = new GregorianCalendar();

// print current time
System.out.println("" + cal.getTime());

// print the class of cal
System.out.println("" + cal.getClass());

// create a new Integer
Integer i = new Integer(5);

// print i
System.out.println("" + i);

// print the class of i
System.out.println("" + i.getClass());
}
}
运行结果:

class java.util.GregorianCalendar
5
class java.lang.Integer
直观的感受就是getClass就是返回运行实例的Class。

这个时候我们就直接看起java源代码,https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html,发现返回的是正在运行的实例化对象的Class。这和上面代码运行的实际效果是相符合的。

接着看下一段代码:

package concreteHandler;

import java.util.Date;

public class Test extends Date {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
Test myTest=new Test();
myTest.test();
}
public void test(){
System.out.println(super.getClass().getName());//concreteHandler.Test
System.out.println(this.getClass().getName());//concreteHandler.Test

System.out.println(Test.class.getName());//concreteHandler.Test
System.out.println(Date.class.getName());//java.util.Date

System.out.println(Test.class.getClass().getName());
//java.lang.Class
//因为类.class就可以获得class了,再一个getClass()就直接到java.lang.Class
System.out.println(Date.class.getClass().getName());//java.lang.Class
System.out.println(Test.class.getClass());//class java.lang.Class
System.out.println(Date.class.getClass());//class java.lang.Class

System.out.println(Test.class);//class concreteHandler.Test
System.out.println(Date.class);//class java.util.Date

System.out.println(Test.class.getSuperclass()); //class java.util.Date
//遇到错误
//Cannot make a static reference to the non-static method的解决方法
//http://blog.csdn.net/aeolus1019/article/details/7974430

}
}
运行结果其实我已经写在上面了,比较奇怪的一点就是super.getClass().getName(),不是应该返回Date???但是实际上返回的还是Test。很疑惑吧。

解释:

第一点:Test还是Dtae的getClass()都是从Object继承来的

第二点:返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。

第三点:想要获得运行实例对象的父类,使用Test.class.getSuperclass()。而不是和其他文章说的Test.getClass().getSuperclass().

最后,是自己之前看到过的一点基础知识。
https://zhidao.baidu.com/question/272896069.html
获取Class的三种方法:

实例化对象.getClass()、类.class、Class类的静态方法 Class.forName("包名.类路径")

获取class之后可以利用反射特性进行操作:

this.getClass().newInstance(); //用缺省构造函数创建一个该类的对象

this.getClass().getInterfaces(); //获得此类实现的接口信息

this.getClass().getMethods();//获得此类实现的所有公有方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java