使用Reflection API,可以在运行时更改或获取字段的值。例如,您可以在API中使用它,以根据某个因素(例如操作系统)来检索不同的字段。您也可以删除修饰符,例如final允许修饰最终的字段。
为此,您将需要以getField()如下所示的方式使用Class#方法:
// Get the field in class SomeClass "NAME". Field nameField = SomeClass.class.getDeclaredField("NAME"); // Get the field in class Field "modifiers". Note that it does not // 需要是静态的 Field modifiersField = Field.class.getDeclaredField("modifiers"); // 即使宣布为私有也允许任何人访问 modifiersField.setAccessible(true); // Get the modifiers on the "NAME" field as an int. int existingModifiersOnNameField = nameField.getModifiers(); // 现有修饰符上的按位AND NOTModifier.FINAL(16) // Readup here https://en.wikipedia.org/wiki/Bitwise_operations_in_C // 如果不确定什么是按位运算。 int newModifiersOnNameField = existingModifiersOnNameField & ~Modifier.FINAL; // 为非静态字段设置对象下的修饰符字段的值 modifiersField.setInt(nameField, newModifiersOnNameField); //将其设置为可访问。这将覆盖普通的Java // 私有/受保护/程序包/等访问控制检查。 nameField.setAccessible(true); // Set the value of "NAME" here. Note the null argument. // 修改静态字段时传递null,因为没有实例对象 nameField.set(null, "被反射砍死..."); //在这里我可以直接访问它。如果需要,请使用反射进行获取。(下面) System.out.println(SomeClass.NAME);
获取字段要容易得多。我们可以使用Field#get()及其变体来获取其值:
// Get the field in class SomeClass "NAME". Field nameField = SomeClass.class.getDeclaredField("NAME"); // 设置为私有字段可访问 nameField.setAccessible(true); // 传递null因为没有实例,还记得吗? String name = (String) nameField.get(null);
请注意以下几点:
使用Class#getDeclaredField时,可使用它来获取类本身中的字段:
class HackMe extends Hacked { public String iAmDeclared; } class Hacked { public String someState; }
在这里,HackMe#iAmDeclared是声明字段。但是,HackMe#someState不是声明的字段,因为它是从其超类Hacked继承的。
问题内容: 我有一个计划不佳的数据库,该数据库在诸如“ 1、2、5、10”之类的文本列中有一个ID集。我需要得到以相同方式设置的两列的交集。我不喜欢使用PHP或其他脚本语言来执行此操作,我也不喜欢MySQL自定义函数。有什么办法可以得到逗号分隔字符串给定的两个集合的交集? 实际上,我不需要完整的交集,我只需要知道两组中是否存在相同的数字。如果是,我需要具有“ 1”,如果没有相同的数字,则需要具有“
问题内容: 我将如何使用Java的ArrayList的getter和setter方法?这就是我所拥有的。我认为我正确地使用了吸气剂,但是我不知道如何为ArrayList使用setter。 问题答案: 要设置值,您可以将pass作为参数,只需将设置为参数即可。 另外,请注意使用而不是问题中所显示的。通常,setter方法不返回任何内容。
我正在尝试为属性创建get和set方法: 设置值的关键字是什么?
我是AWS-SDK的新手,我正在EC2实例上运行一个node.js应用程序。 我正在尝试在node.js应用程序中使用ElastiCache-Redis。但是,我找不到ElastiCache的API来进行基本的Redis调用。下面的url没有提供任何Redis命令。 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElastiCache
问题内容: 创建像这样的结构后: 如何创建Foo的新实例并设置并获取名称?我尝试了以下方法: 没有打印任何内容,因为名称为空。那么如何设置结构中的字段? 工作操场 问题答案: 评论(和工作)示例: 测试并进行Go之旅,以了解有关方法和指针以及Go的基础知识的更多信息。