`

Trail: The Reflection API1

 
阅读更多

所有的变量类型或者是一个引用,或者是原始类型, 字符串,类,枚举,数组,接口,注解,都是引用

对所有的对象,JVM都会立即生产一个java.lang.Class的不可变实例,包含各种方法来检测这个对象的运行时属性

Class也可以创建新类和新对象,也是所有反射API的主入口

 

java.lang.reflect 包中的所有类都没有public的构造,只能调用Class的相关方法获得他们的实例

1.如果存在一个实例对象,最简单的方法就是调用Object.getClass()来获得Class对象

2.如果没有实例,只有一个类型,可以使用XX.class,当然更适合于原始类型.class,也适用于多重数组,包括void类型

 

 3.Class.forName("com.duke.MyLocaleServiceProvider");

一般用于全名,是Class类的static方法,可以直接用,不过原始类型只能用第二种

 

 

Class cDoubleArray = Class.forName("[D");//类似于double[].class

Class cStringArray = Class.forName("[[Ljava.lang.String;");//类似于String[][].class

4.每个包装类包括Void,都有个TYPE字段,也会获得Class对象

 

5.有的方法也会返回另一个Class对象,不过前提是已经有了一个Class对象

 

Class.getSuperclass()//父类
Class.getEnclosingClass()//外部类
Class.getClasses()//返回所有内部类,枚举,接口,包括继承过来的

Character也有几个方法(略)

 

 

XX.getDeclaringClass()//可以是Class,Field,Method,Constractor

当然匿名内部类是没有名字的,名字是null

 

 

每个类和成员都会有不同的修饰符(modifiers),包括注解,java.lang.reflect.Modifier

但不是所有注解都能通过反射得到

 

getDeclaredField()会返回包括private字段,但不包括继承的

getField()会返回public的字段,也包括继承的

字段和方法都是这样,但构造是没有继承这一说

 

 

private static void printMembers(Member[] mbrs, String s) {//这是一个通用的成员打印方法
	out.format("%s:%n", s);
	for (Member mbr : mbrs) {
	    if (mbr instanceof Field)
		out.format("  %s%n", ((Field)mbr).toGenericString());
	    else if (mbr instanceof Constructor)
		out.format("  %s%n", ((Constructor)mbr).toGenericString());
	    else if (mbr instanceof Method)
		out.format("  %s%n", ((Method)mbr).toGenericString());
	}
	if (mbrs.length == 0)
	    out.format("  -- No %s --%n", s);
	out.format("%n");
    }

 

 

 

Class.newInstance()可以用来实例化一个对象,但调用的是无参的那个构造,没有无参构造会异常

所以应该用Constructor.newInstance(),可以传入参数

 

 

reflect包中有个Member接口,代表类中的成员,

实现它的类有Field,Method,和Constructor

按照最新规范,继承来的东西也属于成员,而构造并不属于成员,reflect包的这个实现是比较特殊的

 

另外三个类的父类是AccessibleObject 类,里面有方法setAccessible(true),和static方法

还有,反射里,对字段重新赋值的话,是没有自动装箱拆箱的

 

Field类里的setXX方法会降低很多性能,因为涉及到很多操作,不过在JRE看来效果是一样的

在没有setAccessible(true)之前,final的字段是不能修改的,但有了权限后的确可以修改

public field 都包括:

这个类中定义的

这个类的父类中定义的

这个类实现的接口中定义的

这个类实现的接口所继承的接口中的

 

 

 public static void main(String... args) {//这样写跟以前是一样的,数组完全可以取代可变长度参数列表

 

 

 

分享到:
评论

相关推荐

    vsce-sourcetrail:VS Code Extension使编辑器与Sourcetrail同步-Source code editor

    VS代码的Sourcetrail扩展 此扩展使VS Code可以与进行通信 链接 项目主页,新闻: 说明文件: 下载,评论: 代码,问题: 特征 插件设置 通过上下文菜单将VS Code中的位置发送到Sourcetrail 显示插件是否连接...

    ML-model-deployment-trail:通过在heroku上部署来测试Web API

    本项目“ML-model-deployment-trail”聚焦于通过Heroku平台进行Web API的部署,以实现远程访问和测试模型。Heroku是一个流行的云平台,特别适合小型应用和快速原型的部署。 在描述中提到,此项目是用于测试在Heroku...

    technoutlarsh-trail:现在不行

    1. **项目规模**:小型项目可能更适合轻量级的库,如jQuery,而大型复杂项目则可能需要更强大的框架如Angular。 2. **学习曲线**:对于新接触JavaScript的团队,Vue.js通常因其易学性和直观的API而受到青睐。 3. **...

    Trail:Scala平台的路由库

    它提供了简洁、高效的 API,使得开发者能够方便地构建和管理应用的路由规则。Trail 的设计目标是零依赖,这意味着它不依赖任何外部库,这有利于减少项目的复杂性和维护成本。同时,由于支持 Scala.js 和 Scala ...

    trail:Trail 是一个协作的实时任务管理环境

    Trail 是一个协作的实时任务管理环境。 堆 Trail 的客户端使用 AngularJS 构建,使用 Firebase 作为持久性服务。 Trail 还使用 NodeJS 服务器来存储附加(外围)数据。 服务 Firebase:用于获得实时用户体验。 所有...

    proton_trail:Godot引擎的3D Trail附加组件

    ProtonTrail-Godot的3D Trail插件 概述 Godot Engine的3D Trail自​​定义节点 在运行时生成 可调分辨率 它只是一个网格,因此您可以在其上应用自己的材料 如何使用 将存储addons到您的addons文件夹 转到Project ...

    vim-sourcetrail:用于与Sourcetrail通信的Vim插件

    vim-sourcetrail Vim插件可将光标位置与同步。 安装 使用您选择的插件管理器。 git clone https://github.com/CoatiSoftware/vim-sourcetrail ~/.vim/bundle/vim-sourcetrail 将Plugin 'CoatiSoftware/vim-source...

    trail:审核跟踪日志服务

    Trail是一种模块化且灵活的审核跟踪日志服务。 特征 作为独立服务器运行或扩展现有服务 具有灵活架构的Postgres后端 REST和GraphQL接口 支持Fastify和Hapi框架 文献资料 完整文档可在或docs/文件夹中找到。 执照 ...

    sequelize-paper-trail:Sequelize插件,用于跟踪模型实例的修订历史记录

    想要的帮助:请尝试sequelize-paper-trail@3.0.0-rc.6并给 :thumbs_up: / :thumbs_down: 如果它按预期工作,请。 跟踪模型的更改,以进行审核或版本控制。 查看模型在其生命周期的任何阶段的样子,将其还原为任何...

    matlabauc代码-Trail:踪迹

    [1]杜东阳,吕文兵等。 用于从治疗后鼻咽18F-FDG PET / CT图像中最佳区分复发与炎症的机器学习方法。 J Nucl Med,2018年第1期。 59号补充1125 该matlab代码包含2个演示: “ demo_tr_te_CI”:matlab代码,通过使用...

    Paper-Trail:OSU Hackathon 2021年Spring

    1. **基础语法**:包括变量声明(var, let, const)、条件语句(if...else)、循环(for, while)、函数定义和调用等。 2. **DOM操作**:Document Object Model(DOM)是HTML和XML文档的结构化表示。JavaScript可以...

    trail:这是一个用于跟踪的存储库 - 一种跟踪日志的新方法

    这是一个用于跟踪的存储库 - 一...启动 Trail 的步骤: cd kibana/样品 节点服务器.js 转到浏览器并启动: 笔记: 确保 elastic-search 在 localhost:9200 上运行 在elastic-search中保留一些数据以便能够开始查询

    trail:将Laravel命名路由导出到JavaScript的另一种尝试

    踪迹该软件包将公开一个@trail刀片指令,您可以将其包含在主刀片或布局文件中。 此刀片指令公开了一个Trail JavaScript对象,该对象包含config和应用程序具有的命名路由的集合。 如果您知道我的意思,该指令还公开了...

    yii-audittrail:AuditTrail Yii Extension的分支

    步骤1 要安装,您必须首先选择一个放置此存储库的文件夹。 我已经选择: /root/backend/extensions/modules因为这对我来说似乎是最正确的。 将此存储库克隆到该位置。第2步该安装表了。 您可以使用此扩展的原始作者...

    paper_trail:跟踪对Rails模型的更改

    paper_trail 科 Ruby 活动记录 未发行 主 > = 2.5.0 > = 5.2,<6> = 2.4.0 > = 5.2,<6> = 2.3.0 > = 4.2,<6> = 2.3.0 > = 4.2,<5> = 2.2.0 > = 4.2,<5> = 2.1.0 > = 4.0,<5> = 1.9.3 > = 4.0,<5> = ...

    eulerian-trail:Hierholzer算法的实现,以在图中查找欧拉轨迹

    $ npm install --save eulerian-trail 用法 var eulerianTrail = require ( 'eulerian-trail' ) ; eulerianTrail ( { edges : [ [ 0 , 1 ] , [ 1 , 2 ] , [ 2 , 3 ] , [ 3 , 6 ] , [ 6 , 7 ] , [ 7 , 10 ] ,...

    rentx:在Rocketseat Ignite中开发的应用程序-Node.JS Trail

    Rocketseat Ignite开发的汽车租赁应用程序-NodeJS Trail :laptop: 使用: :backhand_index_pointing_right: 磨碎机 :backhand_index_pointing_right: 昂首阔步 :backhand_index_pointing_right: ORM型 :...

    D3-trail:D3 的路径布局

    D3 步道布局 这是用于在 D3 中创建路径的布局函数,其中(与原生 d3.svg.line() 元素不同)您需要将特定的美学应用到行的每个元素。 演示 最初的用例是具有衰减不透明度的轨迹来表示运动:这是一个示例图像: (即将...

    Washington_Trail:该存储库适用于我们的Digital Humanities 1030课程

    在我们的“Digital Humanities 1030”课程中,有一个名为“Washington_Trail”的项目,它提供了一种独特的方式来探索历史,特别是美国国父乔治·华盛顿年轻时的一段重要旅程。通过这个项目,我们可以深入研究华盛顿...

    paper_trail:使用Ecto跟踪并记录数据库中的所有更改。 恢复到历史记录中的任何时间

    你可以通过`PaperTrail.version_changes/1`查询这些变化。 为了恢复到历史中的某个版本,你可以使用`PaperTrail.revert/3`函数。这个函数接受模型实例、目标版本号以及可选的事务选项,它会将模型回滚到指定版本的...

Global site tag (gtag.js) - Google Analytics