Java 反射(Class class相关)
>Class类:反射的根源
>1.Object class,是所有的Java classes的继承根源,
其内声明了数个应该在所有Java class中被改写methods:hashCode()、equals()、clone()、toString()、getClass()等。
其中getClass()返回了一个 Class object
>2.小插曲:为什么重写hashCode()和重写eauqls()要同时进行?
>3.Class class
- Class class十分特殊。它和一般classes一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types(8个)
- (boolean, byte, char, short, int, long, float, double)以及关键词void
- 当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class object。如果想借由“修改Java标准库源码”来观察Class object的实际生成时机(例如在Class的constructor内添加一个println())不能够!因为Class并没有public constructor
- 换句话说,不能new!Class是通过Java虚拟机通过内部机制new出来实例,并且去执行的
- Class是Reflection的起源。针对任何想要探勘的class,唯有先为它产生一个Class object,接下来才能经由后者唤起数十多个的Reflection APIs
>4.Class 对象取得途径:
Java允许多种方式为一个class生成对应的Class object,不管一个Java类生成多少个对象,这些对象所对应的Class对象只有唯一的一个。
注意:
- 调用Object class 对应的Class对象的getsuperclass()会返回null(再往上,null调用任意方法都会抛空指针异常)
- 最后的方式,对于原生的8种类型,使用.class语法,包装类型,使用.TYPE语法
>5.运行时生成instances
欲生成对象实体,在Reflection 动态机制中有两种作法,一个针对“无自变量ctor”,一个针对“带参数ctor”。如果欲调用的是“带参数ctor“就比较麻烦些,不再调用Class的newInstance(),而是调用Constructor 的newInstance()。首先准备一个Class[]做为ctor的参数类型(本例指定为一个double和一个int),然后以此为自变量调用getConstructor(),获得一个专属ctor。接下来再准备一个Object[] 做为ctor实参值(本例指定3.14159和125),调用上述专属ctor的newInstance()。
不含参数构造(省略了构造步骤):
含参数构造(先获取相应的构造器,再用构造来生成对象,这种方式是通用的):
>6.运行时调用methods
这个动作和上述调用“带参数之ctor”相当类似。首先准备一个Class[]做为参数类型(本例指定其中一个是String,另一个是Hashtable),然后以此为自变量调用getMethod(),获得特定的Method object。接下来准备一个Object[]放置自变量,然后调用上述所得之特定Method object的invoke()。
为什么获得Method object时不需指定回返类型?因为方法重载不包含返回值,只包含名字和返回值构成方法签名,来唯一标识一个方法。
>7.运行时变更fields内容
首先调用Class的getField()并指定field名称。获得特定的Field object之后便可直接调用Field的get()和set()
最后,关于一些反射方法调用时,我们会发现传入了某个对象的引用,这是因为一个类可能生成多个不同的实例,当调用成员或者成员方法时,可能会得到不同的结果,所以我们必须要指定获取哪一个对象里的成员或者成员方法的执行。
Java 反射(Class class相关)相关推荐
- Java 反射(Array相关)
>使用Array的静态方法 动态创建一维数组 public class ArrayTester1 {/*** java.lang.reflect.Array类 提供了动态创建和访问数组的 各种静 ...
- java 7 反射_【7】java 反射详解
[7]java 反射详解 获取Class对象的方式: 1. Class.forName("全类名"); 将字节码加载进内存,返回Class对象,多用于配置文件,将类名定义在配置文件 ...
- 安卓逆向-new-sec6-4 Java反射相关知识以及平头哥框架hook构造函数 | App发布测试版本感染
反射机制 app加上这个属性,也能发布测试版本,被成功感染,无需签名和发布那个release版本 APP是E:\1A_androidstudio_project\course4 插件是E:\1A_an ...
- Java反射机制基本概念与相关Class类对反射机制的实现
Java反射机制 1.何为反射 2.反射作用 3.Class类实例化应用 3.1.进行Class类对象的实例化的三种方式 3.2.Class类实例化其他类对象的两种方式 3.2.1.调用newInst ...
- Java 反射 (快速了解反射)
反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...
- java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class
一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...
- Java反射(详述版)
一.什么是反射? 我们先来看一个例子: package venus; public class Student {public String name;public Student(){System. ...
- java 反射 动态代理
在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...
- Java反射机制分析指南
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- 反射 字段_详解面试中常考的 Java 反射机制
反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性和方法. 反射是一项高级 ...
最新文章
- 如何二值图转化为灰度图_木工真空吸附雕刻机如何用精雕5.21把精雕图模型转为灰度图...
- numpy.concatenate详解
- css清除浮动的几种方法_CSS--清除浮动
- 我的世界源代码python_用Python写的游戏《我的世界》 还原初代世界
- clickhouse建库_ClickHouse高性能数据库
- mysql5.6允许远程服务器访问数据库
- fwrite函数Matlab,fread和fwrite函数,C语言fread和fwrite函数详解
- TOMCAT开放远程调试端口
- Mysql学习总结(63)——Mysql数据库架构方案选择与分析
- 【汇编优化】ARM Intrinsic优化
- 你值得收藏:这个免费AI可以神奇拯救低分辨率照片
- 基于java的客户关系管理系统的设计与实现(论文+毕业设计)(完整源码可演示)
- MM-DD-RRRR / MM-DD-YYYY 的区别【Blog 搬家】
- 令人迷惑的scp路径
- 用Python来玩微信小游戏跳一跳
- linux 读卡器信息,Linux如何使用笔记本自带的SD/MMC读卡器
- 云服务器SNAT访问互联网
- 微信公众号开发--微信消息可以直接点击,然后请求中控服务器获取数据
- 安卓10 charles抓Https包 和 配置
- 第二银河找不到更新服务器,第二银河可以挂机吗?挂机设置步骤一览