能否将字符串与Plays类的属性名称进行匹配比较?
判断字符串是否匹配Plays类的属性名称?
现有Plays类代码
public class Plays { private Hamlet hamlet; private AsLike aslike; private Othello othello; public Plays() { } //getters & setters }
待解析的JSON结构
{ "hamlet": { "name": "Hamlet", "type": "tragedy" }, "aslike": { "name": "As You Like It", "type": "comedy" }, "othello": { "name": "Othello", "type": "tragedy" } }
场景与需求
已知改用Play.java类并将实例存入列表的方案更合理,但由于待解析的JSON为嵌套对象结构且不可修改,调整Java类结构会影响JSON解析。当前核心需求是:判断给定字符串是否与Plays类的属性名称(如hamlet、aslike、othello)一致。
解决方案:完全可以实现
以下是两种常用的实现方式:
方式一:利用Java反射机制
通过反射获取Plays类的所有字段,提取字段名存入集合后,直接判断目标字符串是否在集合中。这种方式无需手动维护属性列表,能自动适配类的字段变更:
import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; public class PlayChecker { public static boolean isPlayProperty(String target) { Class<Plays> playsClass = Plays.class; Field[] fields = playsClass.getDeclaredFields(); Set<String> propertyNames = new HashSet<>(); for (Field field : fields) { propertyNames.add(field.getName()); } return propertyNames.contains(target); } public static void main(String[] args) { System.out.println(isPlayProperty("hamlet")); // 输出 true System.out.println(isPlayProperty("macbeth")); // 输出 false } }
注意:
getDeclaredFields()可以获取类中所有声明的字段(包括private修饰的),无需额外设置访问权限,因为我们只需要读取字段名称。
方式二:手动维护属性名称集合
如果不想使用反射,可手动将Plays类的属性名存入常量集合,直接进行判断。这种方式性能更好,但需要注意当Plays类的属性修改时,需同步更新集合:
import java.util.HashSet; import java.util.Set; public class PlayChecker { private static final Set<String> PLAY_PROPERTY_NAMES = new HashSet<>(); static { PLAY_PROPERTY_NAMES.add("hamlet"); PLAY_PROPERTY_NAMES.add("aslike"); PLAY_PROPERTY_NAMES.add("othello"); } public static boolean isPlayProperty(String target) { return PLAY_PROPERTY_NAMES.contains(target); } }
内容的提问来源于stack exchange,提问作者Naky
相关产品推荐
相关产品推荐

