java中类名.class、实例.getclass()区别
import java.util.HashSet;
import java.util.Iterator;
/**
* Created by GOD on 2016/1/23.
* Class对象的生成方式如下:
1.类名.class 说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象
2.Class.forName("类名字符串") (注:类名字符串是包名+类名) 说明:装入类,并做类的静态初始化,返回Class的对象
3.实例对象.getClass() 说明:对类进行静态初始化、非静态初始化;返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
*/
public class ClassAndGetclass {
public static void main(String[] args) throws ClassNotFoundException {
//测试.class
Class testTypeClass = TestClassType.class;
System.out.println("testTypeClass---" + testTypeClass);
System.out.println("类装入内存完毕");
//测试Class.forName()
Class testTypeForName = Class.forName("TestClassType");
System.out.println("testTypeForName---" + testTypeForName);
//测试Object.getClass()
TestClassType testTypeGetClass = new TestClassType();
System.out.println("testTypeGetClass---" + testTypeGetClass.getClass());
HashSet hashSet = new HashSet();
hashSet.add("s");
Iterator iterator = hashSet.iterator();
System.out.println(iterator.getClass().getName());
System.out.println(Iterator.class.getName());
}
}
class TestClassType {
//构造函数
public TestClassType() {
System.out.println("----构造函数---");
}
//静态的参数初始化
static {
System.out.println("---静态的参数初始化---");
}
//非静态的参数初始化
{
System.out.println("----非静态的参数初始化---");
}
}
输出结果:
testTypeClass---class TestClassType 类装入内存完毕 ---静态的参数初始化--- testTypeForName---class TestClassType ----非静态的参数初始化--- ----构造函数--- testTypeGetClass---class TestClassType java.util.HashMap$KeyIterator java.util.Iterator
生成Class对象的过程其实是如此的:
当 我们编写一个新的java类时,JVM就会帮我们编译成class对象,存放在同名的.class文件中。在运行时,当需要生成这个类的对象,JVM就会 检查此类是否已经装载内存中。若是没有装载,则把.class文件装入到内存中。若是装载,则根据class文件生成实例对象。
import java.util.*;
import java.lang.reflect.*;
public class CSDN {
public static void main(String args[]) throws Exception{
Set s = new HashSet();
s.add("foo");
Iterator it = s.iterator();
Class[] argsClass = new Class[0];
Method m = Iterator.class.getMethod("hasNext",argsClass);
System.out.println(m.invoke(it,argsClass));
}
}//可正常执行
import java.util.*;
import java.lang.reflect.*;
public class CSDN {
public static void main(String args[]) throws Exception{
Set s = new HashSet();
s.add("foo");
Iterator it = s.iterator();
Class[] argsClass = new Class[0];
Method m = it.getClass().getMethod("hasNext",argsClass);
System.out.println(m.invoke(it,argsClass));
}
}
//不能执行
理由同上: System.out.println(iterator.getClass().getName()); java.util.HashMap$KeyIterator
System.out.println(Iterator.class.getName()); java.util.Iterator
java中类名.class、实例.getclass()区别的更多相关文章
- java中extends与implements的区别
学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一 ...
- 转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
- java中堆和堆栈的区别
java中堆和堆栈的区别(一) 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取 ...
- 关于java中构造方法、实例初始化、静态初始化执行顺序
在Java笔试中,构造方法.实例初始化.静态初始化执行顺序,是一个经常被考察的知识点. 像下面的这道题(刚刚刷题做到,虽然做对了,但是还是想整理一下) 运行下面的代码,输出的结果是... class ...
- java中wait和sleep的区别
文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Java中this与super的区别【6】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...
- Java中堆和栈的区别(转)
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...
随机推荐
- [转]微软SerialPort秘籍[SerialPort为什么死锁程序的分析]
既然是秘籍,显然是写一些大家不常找到的,MSDN里遗漏提示大家注意的东西. 用过.net 2.0中,自带SerialPort的人,大多都遇到过.莫名其妙的执行Close的时候会死掉的问题.而Wince ...
- java利用zxing编码解码一维码与二维码
最近琢磨了一下二维码.一维码的编码.解码方法,感觉google的zxing用起来还是比较方便. 本人原创,欢迎转载,转载请标注原文地址:http://wallimn.iteye.com/blog/20 ...
- 杭电1020-Encoding
Problem Description Given a string containing only 'A' - 'Z', we could encode it using the following ...
- java 类加载顺序
1.虚拟机在首次加载Java类时,会对静态初始化块.静态成员变量.静态方法进行一次初始化 2.只有在调用new方法时才会创建类的实例 3.类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始 ...
- ado.net基础思想-abstract
抽象类用做基类不能被实例化用途是派生出其他非抽象类 接口主要是实现多重继承 abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的:• 抽象类不能 ...
- CRB and String
CRB and String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
- ACM Computer Factory
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6104 Accepted: 2113 ...
- 人活着系列之平方数 分类: sdutOJ 2015-06-22 17:10 7人阅读 评论(0) 收藏
人活着系列之平方数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 偶然和必然?命运与意志?生与死?理性与情感?价值与非价值?在&quo ...
- Radar之字节流加载图片
获取GUITexture GameObject _obj = GameObject.Find("Tex1"); GUITexture _tex = _obj.GetComponen ...
- 2017年1月8日 星期日 --出埃及记 Exodus 21:34
2017年1月8日 星期日 --出埃及记 Exodus 21:34 the owner of the pit must pay for the loss; he must pay its owner, ...