.class, class.forName(), getClass()的区别
类名.class叫做“类字面量”,因class是关键字, 所以类名.class编译时确定。
getclass()运行时根据实际实例确定,getClass()是动态而且是final的。
String.class 是能对类名的引用取得在内存中该类型class对象的引用,
new String().getClass() 是通过实例对象取得在内存中该实际类型class对象的引用。
它们和Class.forName(): (http://www.cnblogs.com/feiyun126/p/3229492.html)
1:Class cl=A.class;
JVM将使用类A的类装载器, 将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象。
2:Class cl=对象引用o.getClass();
返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象 。
3:Class.forName("类名");
.装入类A,并做类的初始化
.getClass()是动态的,其余是静态的。
.class和class.forName()只能返回类内field的默认值,getClass可以返回当前对象中field的最新值
Class.forName() 返回的是一个类,.newInstance() 后才创建一个对象,Class.forName()的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的.
待反射类:
package yerasel;
public class Person {
private String name = "Alfira";
public void getName() {
System.out.println(name);
}
public void setName(String name, int a) {
this.name = name + a;
}
}
反射代码:
package yerasel;
import java.lang.reflect.Method;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
show("yerasel.Person");
}
private static void show(String name) {
try {
// JVM将使用类A的类装载器,将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作
Class classtype3 = Person.class;
// 获得classtype中的方法
Method getMethod3 = classtype3.getMethod("getName", new Class[] {});
Class[] parameterTypes3 = { String.class, int.class };
Method setMethod3 = classtype3
.getMethod("setName", parameterTypes3);
// 实例化对象,因为这一句才会输出“静态初始化”以及“初始化”
Object obj3 = classtype3.newInstance();
// 通过实例化后的对象调用方法
getMethod3.invoke(obj3); // 获取默认值
setMethod3.invoke(obj3, "Setting new ", 3); // 设置
getMethod3.invoke(obj3); // 获取最新
System.out.println("----------------");
// 返回运行时真正所指的对象
Person p = new Person();
Class classtype = p.getClass();// Class.forName(name);
// 获得classtype中的方法
Method getMethod = classtype.getMethod("getName", new Class[] {});
Class[] parameterTypes = { String.class, int.class };
Method setMethod = classtype.getMethod("setName", parameterTypes);
getMethod.invoke(p);// 获取默认值
setMethod.invoke(p, "Setting new ", 1); // 设置
getMethod.invoke(p);// 获取最新
System.out.println("----------------");
// 装入类,并做类的初始化
Class classtype2 = Class.forName(name);
// 获得classtype中的方法
Method getMethod2 = classtype2.getMethod("getName", new Class[] {});
Class[] parameterTypes2 = { String.class, int.class };
Method setMethod2 = classtype2
.getMethod("setName", parameterTypes2);
// 实例化对象
Object obj2 = classtype2.newInstance();
// 通过实例化后的对象调用方法
getMethod2.invoke(obj2); // 获取默认值
setMethod2.invoke(obj2, "Setting new ", 2); // 设置
getMethod2.invoke(obj2); // 获取最新
System.out.println("----------------");
} catch (Exception e) {
System.out.println(e);
}
}
}
.class, class.forName(), getClass()的区别的更多相关文章
- java中Class对象详解和类名.class, class.forName(), getClass()区别
一直在想.class和.getClass()的区别,思索良久,有点思绪,然后有网上搜了搜,找到了如下的一篇文章,与大家分享. 原来为就是涉及到Java的反射----- Java反射学习 所谓反射,可以 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- .class和.getClass()的区别
使用指定类初始化日志对象,在日志输出的时候,可以打印出日志信息所在类 如: getClass() 返回此 Object 的运行时类. //需要有com.lpx.test.class这个类 Logger ...
- 类名.class, class.forName(), getClass()区别
1:Class cl=A.class; JVM将使用类A的类装载器, 将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象. 2:Class cl=对象引 ...
- Class.forName、Class.class(属性)、getClass()的区别
1.出现的时期不同:Class.forName()在运行时加载:Class.class和getClass()是在编译器加载2.Class.class只是在编译时用来存放类的相关信息,并没有实例化对象: ...
- 【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别
Class对象的生成方式如下: 1.类名.class 说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Cla ...
- java中类名.class, class.forName(), getClass()区别
Class对象的生成方式如下: 1.类名.class 说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Cla ...
- java反射中Class对象详解和类名.class, class.forName(), getClass()区别
1.获得类型类 可以看到,对象a是A的一个实例,A是某一个类,在if语句中使用a.getClass()返回的结果正是类A的类型类,在Java中表示一个特定类型的类型类可以用“类型.class”的方式获 ...
- 从一个例子学习 instanceof 和 getclass 的区别
判断两个对象是否为同一类型,时常用到getclass 和 instanceof ,而这两个函数又是时常让人混淆.下面从一个例子说明两者的区别: public class Test_drive { pu ...
随机推荐
- java线程池技术(一):ThreadFactory与BlockingQueue
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.ThreadFactory概述以及源码分析 ThreadFactory很简单,就是一个线程工厂也就是负责生产线程的,我们看下ThreadFact ...
- javamail+ical4j发送会议提醒
本篇讲述小编在使用ical4j时对其的理解与使用,留作笔记的同时希望能帮助到大家! 初学者可以先了解下ical4j的基本信息: iCalender编程基础,了解与使用ical4j:https://ww ...
- 安装RabbitMQ(一)
RabbitMQ简介 RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能.健壮以及可伸缩性出名的 ...
- hdfs文件按修改时间下载
应用于:对于不同用户创建的表目录,进行文件的下载,程序中执行hadoop cat命令 下载文件到本地,随后通过ftp传至目标服务器,并将hdfs文件目录的修改时间存入mysql中.每次修改前将mysq ...
- MYSQL 基础总结
学习笔记 [mysql 是不区分大小写的,要区分可以用相应的函数:所有标点符号全是英文状态下的] 一.基础部分 //创建数据库 Create database database_name; //使 ...
- 2017年StackOverflow上最好的20个Python问题
1.Python的 .. (点号 点号) 是什么语法? 答案地址:https://stackoverflow.com/questions/43487811/what-is-python-dot-dot ...
- 【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误
当你在页面上用 form post 内容时,可能会遇到以下异常: The required antiforgery cookie "????????" is not present ...
- 登录功能(MD5加密)
登录这个功能,是不管哪个项目都会用到的,登录做的好坏,安全性的保障将直接影响到整个系统的成败,尤其是一些安全性要求比较严格的项目 1.首先需要对密码进行加密,这里用到的是md5加密,需要在login. ...
- MysqL 主从事务数据安全之sync_binlog
sync_binlog:是MySQL 的二进制日志(binary log)同步到磁盘的频率(刷新二进制日志到磁盘),默认是0,意味着mysql并不刷新,由操作系统自己决定什么时候刷新缓存到持久化设置, ...
- Web自动化之Headless Chrome测试框架集成
使用Selenium操作headless chrome 推荐 简介 WebDriver是一个W3C标准, 定义了一套检查和控制用户代理(比如浏览器)的远程控制接口,各大主流浏览器来实现这些接口以便调用 ...