老在别人源码中看见isSynthetic方法来判断是否是“复合字段”,但总是不明其意。今天看见一份实例有所启发,不敢独享。其实文档中Field的isSynthetic翻译成“复合字段”我就觉得有歧义。还是Member接口中的翻译贴切些:“如果此成员是编译器引入的,则返回 true;否则,返回 false。”
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Sun Microsystems nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import static java.lang.System.out;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
enum Spy {
BLACK, WHITE
}
public class FieldModifierSpy {
volatile int share;
int instance;
class Inner {
}
public static void main(String... args) {
try {
Class<?> c = Class.forName(args[0]);
int searchMods = 0x0;
for (int i = 1; i < args.length; i++) {
searchMods |= modifierFromString(args[i]);
}
Field[] flds = c.getDeclaredFields();
out.format("Fields in Class '%s' containing modifiers: %s%n", c
.getName(), Modifier.toString(searchMods));
boolean found = false;
for (Field f : flds) {
int foundMods = f.getModifiers();
// Require all of the requested modifiers to be present
if ((foundMods & searchMods) == searchMods) {
out.format("%-8s [ synthetic=%-5b enum_constant=%-5b ]%n", f
.getName(), f.isSynthetic(), f.isEnumConstant());
found = true;
}
}
if (!found) {
out.format("No matching fields%n");
}
// production code should handle this exception more gracefully
} catch (ClassNotFoundException x) {
x.printStackTrace();
}
}
private static int modifierFromString(String s) {
int m = 0x0;
if ("public".equals(s))
m |= Modifier.PUBLIC;
else if ("protected".equals(s))
m |= Modifier.PROTECTED;
else if ("private".equals(s))
m |= Modifier.PRIVATE;
else if ("static".equals(s))
m |= Modifier.STATIC;
else if ("final".equals(s))
m |= Modifier.FINAL;
else if ("transient".equals(s))
m |= Modifier.TRANSIENT;
else if ("volatile".equals(s))
m |= Modifier.VOLATILE;
return m;
}
}
这个类展示了以下几个知识点:
- 字段修饰的用法(Field modifiers)
- isSynthetic和isEnumConstant是什么意思
- JDK一些不太常用和非好好用的特性(静态导入和字符串的format方法)
分享到:
相关推荐
modifiers是方法修饰符的集合,也是制作更多的方法。 显然,方法修饰符会修改方法。 具体来说,在 Ruby 术语中,它们是类方法,它们: 取一个符号参数,它命名同一个类的实例方法,和返回相同的符号,但导致对命名...
System.out.println("Modifiers: " + field.getModifiers()); } // 示例代码3:修改属性信息 class MyRevoke { public int pubField = 5; private int priField = 3; } MyRevoke myRevoke = new MyRevoke(); /...
用于创建modifiers.json词典的脚本,以方便修饰符。 用法 编辑make-modifiers.py文件,然后将所需的键添加到hotkeys变量中。 例如,将["KH-FG", "grave"],到hotkeys数组中,以创建⌘ `切换窗口的快捷方式。 另请...
ember install ember-gesture-modifiers 用法 当前仅提供“平移”修改器。 将来会添加更多手势。 平移修饰符 论点 onPanStart-启动平底锅时触发的钩子 onPan-在平底锅更新时触发钩子 onPanEnd-平底锅结束时触发的...
此软件包未在积极开发中,不提供任何支持 高级修饰符 扩展了您可以在 Exp:resso 的商店模块中定义价格修饰符的方式。 执照 麻省理工学院许可证 (MIT) 版权所有 (c) 2014 Jeremy Worboys 特此授予任何人免费获得本...
草稿js修饰符 模块化状态修饰符yarn add draft-js-modifiers# ornpm i draft-js-modifiers用法 import * as Modifiers from 'draft-js-modifiers'const newEditorState = Modifiers . mergeBlockData ( ...
在"cocktail-method-modifiers"这个项目中,我们看到的是如何在CocktailJS中使用类似Moose的方法修饰符。 方法修饰符是编程中一种强大的工具,它们允许我们在方法定义之前或之后插入额外的行为,例如验证、缓存或...
BEM 方法论每年都越来越受到国内外开发人员的欢迎,这已经不是什么秘密了。 越来越受欢迎的一个指标是,许多开发人员正在寻找分叉、开发 BEM、使其适应他们的需求并试验结果的方法。 这篇文章讨论了开发 BEM 并将其...
余烬滚动修饰符 基于Scoll的Ember应用修饰符...兼容性Ember.js v3.8或以上Ember CLI v2.13或更高版本Node.js v10或更高版本安装ember install ember-scroll-modifiers贡献有关详细信息,请参见指南。执照该项目已获得。
qlik-修饰符 一个用于处理Qlik产品中的表达式修饰符JavaScript模块。 !实验! 这个想法是提供一组有用的表达式修饰符以及使用它们的便捷方法。 首先是accumulation ,它可以产生类似于以下结果: ...
@ ember / render-modifiers 提供元素修饰符,可用于挂钩到渲染生命周期的特定部分。何时使用这些修饰符(何时不使用它们) 此软件包中提供的修饰符非常适合快速从经典的Ember组件迁移到Glimmer组件,因为它们很大...
官方离线安装包,亲测可用
本 一个用于创建动态BEM类名的小实用程序。 安装 npm i dynamic-bem-classnames 用法 var bem = require('bem');... active : function ( blockName , element , modifiers ) { return true // logic } ,
Java Class and Method Modifiers
Modifiers: 是否使用Ctrl, Alt, Shift, Win. 3. VirtKey: 虚键值 方法: 构造方法 constructor Create(AOwner: TComponent); override; 析构方法 destructor Destroy; override; 将Windows虚键值转换成...
Modifiers: [ -5] Initial redirection from http to https is to a different host, preventing HSTS [ -5] Subresource Integrity (SRI) not implemented, but all external scripts are loaded over https [ -...
一、问题 vue中当用户提交表单时,有的数据需要去掉前后空格然后再向后端发送。 二、解决方法 ... modifiers: ?ASTModifiers ): ?boolean { const type = el.attrsMap.type const { lazy, number, trim }
嗅探sniffMK是一个简单的实用程序,旨在嗅探macOS上的鼠标和键盘事件。 它基于阿米特·辛格(Amit singh)网站上的代码; ( ) 它旨在促进恶意软件分析(特别是OSX ... 727.726562event: key downkey modifiers: shift
简单的 var classes = { name : 'button' , modifiers : [ 'color' , 'block' ] , states : [ 'disabled' ]} ;cx ( classes , { color : 'green' , block : true } ) ; // "button button--green button--block"cx ...
Redux的快捷方式该软件包提供了一个小的API,用于创建和分配由键盘快捷键触发的redux操作。安装npm install redux-min-shortcuts带React钩子的示例使用挂钩将...const shortcutBindings = [ { key: "z", modifiers: ["C