java中类名.class实例.getclass()区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于java中类名.class实例.getclass()区别的主要内容,如果未能解决你的问题,请参考以下文章

java中类名.class, class.forName(), getClass()区别

java中Class对象详解和类名.class, class.forName(), getClass()区别

java进阶三:反射

Java中9大内置基本数据类型Class实例和数组的Class实例

类名.this与类名.class

Java反射机制--笔记