当前位置: 首页 > 编程笔记 >

Java获取和设置字段

南宫松
2023-03-14
本文向大家介绍Java获取和设置字段,包括了Java获取和设置字段的使用技巧和注意事项,需要的朋友参考一下

示例

使用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的基础知识的更多信息。