【java】深入理解getClass()

之所以标题写的是深入理解,主要是为了让更多人能够惯性思维的以为我这个是一篇好文。事情的真相是我只是为了和网络上面很多抄来抄去的做一下区分而已,自己遇到这个问题的时候,也是百度、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();//获得此类实现的所有公有方法

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值