zoukankan      html  css  js  c++  java
  • 关于getClass()的一些自己的见解

            通过观看视频讲解,我得知,Class 老师讲解的是 这个是类的类,即是管理类的类.当时不是很理解,随后查询了相关资料后,以及真切的运行了几行代码后,才有一些深层次的体会, 在这里想要跟大家分享一下.如果有说的不对的地方,还欢迎老师和同学进行纠错指正.

            首先,我做的就是查看源码,也就是getClass(); 的源码,下面的截图就是我查询到的源码.

     Class Object 类的介绍:

    接着 点击其方法,找到个体Class() ,点击进去查找源码.

    通过查询源码,我得知的是 getClass();运行的结果返回的是是正在运行的实例化对象的Class.也就是说返回的是一个类,而不是一个对象,

    接着,我根据我查看源码得到的结论,在代码实例中进行验证,请看下面的代码:

     1 package concreteHandler;
     2  
     3 import java.util.GregorianCalendar;
     4  
     5 public class ObjectDemo {
     6     public static void main(String[] args) {
     7  
     8         // create a new ObjectDemo object
     9         GregorianCalendar cal = new GregorianCalendar();
    10 
    11         // print the class of cal
    12         System.out.println("" + cal.getClass());
    13  
    14         // create a new Integer
    15         Integer i = new Integer(5);
    16  
    17         // print the class of i
    18         System.out.println("" + i.getClass());
    19     }
    20 }

    代码输出的结果跟我预想的结果是一致的:

    1 class java.util.GregorianCalendar
    2 class java.lang.Integer

    确实是返回运行实例的Class,但是我有一个新的想法,如果这个类和另一个类有着继承的关系的话,那么在运行getClass(); 后,会输出什么样的值,在我没有尝试之前,我个人猜测是会返回其父类的运行实例.于是我开始尝试代码运行,运行代码如下:

     1 package concreteHandler;
     2  
     3 import java.util.Date;
     4  
     5 public class Test extends Date {
     6     private static final long serialVersionUID = 1L;
     7     public static void main(String[] args) { 
     8         Test myTest=new Test();
     9         myTest.test();  
    10     }  
    11     public void test(){  
    12         System.out.println(super.getClass().getName());//concreteHandler.Test
    13         System.out.println(this.getClass().getName());//concreteHandler.Test
    14         
    15         System.out.println(Test.class.getName());//concreteHandler.Test
    16         System.out.println(Date.class.getName());//java.util.Date
    17         
    18         System.out.println(Test.class.getClass().getName());
    19         //java.lang.Class
    20         //因为类.class就可以获得class了,再一个getClass()就直接到java.lang.Class
    21         System.out.println(Date.class.getClass().getName());//java.lang.Class
    22         System.out.println(Test.class.getClass());//class java.lang.Class
    23         System.out.println(Date.class.getClass());//class java.lang.Class
    24         
    25         System.out.println(Test.class);//class concreteHandler.Test
    26         System.out.println(Date.class);//class java.util.Date
    27         
    28         System.out.println(Test.class.getSuperclass()); //class java.util.Date
    29        
    30       
    31     }
    32 }

    其返回值显而易见,关于super.getClass().getName()的返回值,我猜测错误,于是我又查阅了相关的博文和资料,看到有相关总结为以下三个原因,:

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

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

    第三点:想要获得运行实例对象的父类,使用Test.class.getSuperclass()。而不能用 Test.getClass().getSuperclass().

    注:Java的每个类都带有一个运行时类对象,该Class对象中保存了创建对象所需的所有信息。
    可以用.class返回此 Object 的运行时类Class对象,也可以用getClass()获得。

    获取Class的三种方法:

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

  • 相关阅读:
    struts2 CVE-2014-0050(DoS), CVE-2014-0094(ClassLoader manipulation) S2-20 DoS attacks and ClassLoader manipulation
    struts2 CVE-2013-4316 S2-019 Dynamic method executions Vul
    struts2 CVE-2013-2251 S2-016 action、redirect code injection remote command execution
    struts2 CVE-2013-1965 S2-012 Showcase app vulnerability allows remote command execution
    struts2 CVE-2012-0392 S2-008 Strict DMI does not work correctly allows remote command execution and arbitrary file overwrite
    struts2 Advanced Learning
    2015阿里安全峰会
    PHPCMS phpsso_serverphpcmsmodulesphpssoindex.php、apiget_menu.php Authkey Leakage
    CMSEASY /lib/tool/front_class.php、/lib/default/user_act.php arbitrary user password reset vulnerability
    QTVA-2015-198545、WooYun-2015-104148 .NET Framework Arbitrary File Permissions Modify Vul
  • 原文地址:https://www.cnblogs.com/Hveritas/p/9351238.html
Copyright © 2011-2022 走看看