zoukankan      html  css  js  c++  java
  • java中类名.class、实例.getclass()区别

     1 import java.util.HashSet;
     2 import java.util.Iterator;
     3 
     4 /**
     5  * Created by GOD on 2016/1/23.
     6  * Class对象的生成方式如下:
     7  1.类名.class           说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象
     8  2.Class.forName("类名字符串")  (注:类名字符串是包名+类名)  说明:装入类,并做类的静态初始化,返回Class的对象
     9  3.实例对象.getClass()  说明:对类进行静态初始化、非静态初始化;返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
    10  */
    11 public class ClassAndGetclass {
    12     public static void main(String[] args) throws ClassNotFoundException {
    13 
    14 //测试.class
    15         Class testTypeClass = TestClassType.class;
    16         System.out.println("testTypeClass---" + testTypeClass);
    17         System.out.println("类装入内存完毕");
    18 
    19 //测试Class.forName()
    20         Class testTypeForName = Class.forName("TestClassType");
    21         System.out.println("testTypeForName---" + testTypeForName);
    22 
    23 //测试Object.getClass()
    24         TestClassType testTypeGetClass = new TestClassType();
    25         System.out.println("testTypeGetClass---" + testTypeGetClass.getClass());
    26 
    27         HashSet hashSet = new HashSet();
    28         hashSet.add("s");
    29         Iterator iterator = hashSet.iterator();
    30         System.out.println(iterator.getClass().getName());
    31         System.out.println(Iterator.class.getName());
    32 
    33 
    34 
    35     }
    36 }
    37 
    38 class TestClassType {
    39 //构造函数
    40     public TestClassType() {
    41         System.out.println("----构造函数---");
    42     }
    43 //静态的参数初始化
    44     static {
    45         System.out.println("---静态的参数初始化---");
    46     }
    47 //非静态的参数初始化
    48     {
    49         System.out.println("----非静态的参数初始化---");
    50     }
    51 }

    输出结果:

    testTypeClass---class TestClassType
    类装入内存完毕
    ---静态的参数初始化---
    testTypeForName---class TestClassType
    ----非静态的参数初始化---
    ----构造函数---
    testTypeGetClass---class TestClassType
    java.util.HashMap$KeyIterator
    java.util.Iterator

    生成Class对象的过程其实是如此的:

    当 我们编写一个新的java类时,JVM就会帮我们编译成class对象,存放在同名的.class文件中。在运行时,当需要生成这个类的对象,JVM就会 检查此类是否已经装载内存中。若是没有装载,则把.class文件装入到内存中。若是装载,则根据class文件生成实例对象。

     

     


     

     1 import java.util.*;
     2 import java.lang.reflect.*;
     3  
     4 public class CSDN {
     5     public static void main(String args[]) throws Exception{
     6         Set s = new HashSet();
     7         s.add("foo");
     8         Iterator it = s.iterator();
     9         Class[] argsClass = new Class[0];
    10         Method m = Iterator.class.getMethod("hasNext",argsClass);
    11         System.out.println(m.invoke(it,argsClass));
    12     }
    13 }
    //可正常执行
     1 import java.util.*;
     2 import java.lang.reflect.*;
     3  
     4 public class CSDN {
     5     public static void main(String args[]) throws Exception{
     6         Set s = new HashSet();
     7         s.add("foo");
     8         Iterator it = s.iterator();
     9         Class[] argsClass = new Class[0];
    10         Method m = it.getClass().getMethod("hasNext",argsClass);
    11         System.out.println(m.invoke(it,argsClass));
    12     }
    13 }
    14 //不能执行

    理由同上: System.out.println(iterator.getClass().getName());  java.util.HashMap$KeyIterator

         System.out.println(Iterator.class.getName());       java.util.Iterator

    作者:Genesisx

    出处:Genesisx的博客--http://www.cnblogs.com/Genesisx

    您的支持是对博主最大的鼓励,感谢您的认真阅读。

    本文版权归作者和博客园共有,欢迎转载。

    但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    程灵素:我走过山的时候山不说话
    编译原理自学计划
    由一个虚构的例子谈谈中小型研发型项目的技术管理及成本控制(全文)
    用3种IDE导入Linux 2.26 内核源码
    Web风行者的设计方案与计划
    使用pyste自动生成c++类的python wrapper
    让log4cpp日志文件超过2G(Linux下)的方法
    python绑定c++程序
    网络风行者(KSpider)的规则体系结构
    检测您的浏览器是否支持 HTML5 视频方法
  • 原文地址:https://www.cnblogs.com/Genesisx/p/5152946.html
Copyright © 2011-2022 走看看