java黑魔法-反射机制-01


在java的帮助文档中,java.lang包中有一个Class类,注意这里的"C“是大写,所以这个不是表示类的声明,而是一个真正的类。在java的帮助文档中,这样定义的Class类:
public final class Class<T>extends Objectimplements Serializable, GenericDeclaration, Type, AnnotatedElement
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和double)和关键字 void 也表示为 Class 对象。 Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。
在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。Class类不是我们人为创建的,是由java虚拟机,在我们生成.class文件的时候创建的,我们可以通过几种方法,获得这个Class类实例。下面介绍一下这几种方法:
(1)利用对象调用getClass()方法获取该对象的Class实例;
(2)使用Class类的静态方法forName(),用类的名字获取一个Class实例;
(3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例。下面的是一个实例
package com.aaron.reflect;
class Point {
int age;
public void say(){
System.out.println(123);
}
}
public class test {
public static void main(String args[]) {
System.out.println(new Point().getClass());//class com.aaron.reflect.Point 而且有方法say
// Class<?> c11 =(Class<?>)new Point(); 不可以这么转换
Point pt = new Point();
Class<?> c1 = pt.getClass(); // 这个方法经常常见,c1,也没有这个方法
System.out.println("100"+c1.getName()); // com.aaron.reflect.Point
try {// forName会抛出一个异常所以需要捕获,必须加上包的路径
Class<?> c2 = Class.forName("com.aaron.reflect.Point");
System.out.println("101"+c2.getName());//com.aaron.reflect.Point
//System.out.println(c2.say());并没有这个方法
} catch (Exception e) {
e.printStackTrace();
}
Class<?> c3 = Point.class;
System.out.println("000"+c3.getName()); // com.aaron.reflect.Point
Class<?> c4 = int.class;
System.out.println("001"+c4.getName()); // int
Class<?> c5 = Integer.TYPE;
System.out.println("002"+c5.getName()); // int
Class<?> c6 = Integer.class; //每个类都可以看成Class这个类的对象,运用.class的方式来获取Class实例
System.out.println("003"+c6.getName()); // 003java.lang.Integer
}
}
在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。换句话说java中的.class文件并不是所有的都会被加载到内存,只有在需要的时候才会进行加载。
Class类有一方法newInstance(),可以在不知道类的名字的情况下创建一个对象。使用newInstance()的方法的时候,应该注意这个方法默认调用的是不带参数的构造方法。如果只是去创建一个一个不带参数的构造方法,那么这个方法的用处就不大了,如果我们想要调用带参数的构造方法,这里我们就需要使用到反色API。对于反色API的介绍,查看我先前转载的一篇文章(http://blog.csdn.net/mengxiangyue/article/details/6825923)。有时候我们会收到一个通过网络发来的一个类,我们需要创建一个对象,但是对于这个类是怎么实现的,我们都不知道。这里我们就可以使用反色API加上Class类的newInstance(),在不知道类的情况下,创建一个对象。对于这个Class的用处目前就知道这么多,如果还有什么,希望有大侠指点。
java黑魔法-反射机制-01的更多相关文章
- java黑魔法-反射机制-02-通过Java反射调用其他类方法
package com.aaron.reflect; import java.lang.reflect.Method; import java.lang.reflect.InvocationTarge ...
- java 反射机制01
// */ // ]]> java反射机制01 Table of Contents 1 反射机制 2 反射成员 2.1 java.lang.Class 2.2 Constructor 2.3 ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- java笔录---反射机制(1)
引言 为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架, 像spring中核心模块IO ...
- Java高新技术 反射机制
Java高新技术 反射机制 知识概要: (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...
随机推荐
- windows上dubbo-admin的安装
dubbo-admin的安装 (1)先下载好zookeeper包,因为启动dubbo-admin时需要先启动zookeeper zookeeper:dubbo的注册中心(自己下载 ,找到bin目录下的 ...
- JavaScrip(二)JavaScrip语法基础
一:标识符 标识符是指变量,函数的名字,或函数的参数名: 1.命名规则 1.1第一个字符必须是一个字母.下划线(_).或一个美元符号($) 1.2其他字母可以是字母,下划线.美元符号或数字 1.3不能 ...
- 《Python》网络编程之客户端/服务端框架、套接字(socket)初使用
一.软件开发的机构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:QQ.微信.网盘等这一类是属于需要安装的桌面应用 第二种是web类:比如百度.知乎.博客园等使用浏览器访问 ...
- Linux3.10.0块IO子系统流程(4)-- 为请求构造SCSI命令
首先来看scsi_prep_fn int scsi_prep_fn(struct request_queue *q, struct request *req) { struct scsi_device ...
- FPGA复位的可靠性(转)
FPGA复位的可靠性(同步复位和异步复位) reference:http://www.eetop.cn/blog/html/17/743817-24442.html 一.特点: 同步复位:顾名思义, ...
- Centos7安装RabbitMQ解决Erlang依赖报错
通过yum等软件仓库都可以直接安装RabbitMQ,但版本一般都较为保守. RabbitMQ官网提供了新版的rpm包(http://www.rabbitmq.com/download.html),但是 ...
- 牛客多校第二场 G transform
链接:https://www.nowcoder.com/acm/contest/140/G White Cloud placed n containers in sequence on a axes. ...
- 记一次ios加急上架经历
https://developer.apple.com//contact/app-store/?topic=expedite app迭代版本上架之前一直好好的没报错,没crash,但是有一次加急上架, ...
- 更换Homebrew为中科大源
官网:https://brew.sh/index_zh-cn /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com ...
- microsoft office如何在菜单里显示“开发工具”
VBA开发教程: https://www.yiibai.com/vba/vba_excel_macros.html msdn:https://docs.microsoft.com/zh-cn/offi ...