{"record":{"id":"d8260d34c791e2aa","repo":"chinabugotech/hutool","slug":"invalid-getter-or-setter-name","errorCode":null,"errorMessage":"Invalid Getter or Setter name: ","messagePattern":"Invalid Getter or Setter name: ","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java","lineNumber":998,"sourceCode":"\t * <ul>\n\t *     <li>getXxxx获取为xxxx，如getName得到name。</li>\n\t *     <li>setXxxx获取为xxxx，如setName得到name。</li>\n\t *     <li>isXxxx获取为xxxx，如isName得到name。</li>\n\t *     <li>其它不满足规则的方法名抛出{@link IllegalArgumentException}</li>\n\t * </ul>\n\t *\n\t * @param getterOrSetterName Getter或Setter方法名\n\t * @return 字段名称\n\t * @throws IllegalArgumentException 非Getter或Setter方法\n\t * @since 5.7.23\n\t */\n\tpublic static String getFieldName(String getterOrSetterName) {\n\t\tif (getterOrSetterName.startsWith(\"get\") || getterOrSetterName.startsWith(\"set\")) {\n\t\t\treturn StrUtil.removePreAndLowerFirst(getterOrSetterName, 3);\n\t\t} else if (getterOrSetterName.startsWith(\"is\")) {\n\t\t\treturn StrUtil.removePreAndLowerFirst(getterOrSetterName, 2);\n\t\t} else {\n\t\t\tthrow new IllegalArgumentException(\"Invalid Getter or Setter name: \" + getterOrSetterName);\n\t\t}\n\t}\n\n\t/**\n\t * 判断source与target的所有公共字段的值是否相同\n\t *\n\t * @param source           待检测对象1\n\t * @param target           待检测对象2\n\t * @param ignoreProperties 不需要检测的字段\n\t * @return 判断结果，如果为true则证明所有字段的值都相同\n\t * @author Takak11\n\t * @since 5.8.4\n\t */\n\tpublic static boolean isCommonFieldsEqual(Object source, Object target, String... ignoreProperties) {\n\n\t\tif (null == source && null == target) {\n\t\t\treturn true;\n\t\t}","sourceCodeStart":980,"sourceCodeEnd":1016,"githubUrl":"https://github.com/chinabugotech/hutool/blob/8870454b2a0c29cc6ffd31dcf5667c8ceb2fc442/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java#L980-L1016","documentation":"BeanUtil.getFieldName derives the field name from a getter/setter method name by stripping get/set (3 chars) or is (2 chars) and lowercasing the next letter. If the supplied name matches none of those prefixes, it is not a JavaBean accessor and the method throws IllegalArgumentException. The message echoes the offending name.","triggerScenarios":"Passing arbitrary method names like \"hashCode\", \"toString\", \"value\", \"isActive\" (works) vs \"active\" (fails), or names shorter than the prefix.","commonSituations":"Iterating over all methods of a class and calling getFieldName without filtering to accessors; receiving a method name from reflection that may not be a getter/setter.","solutions":["Pre-filter: only call getFieldName on names starting with get/set/is (and longer than the prefix).","Use BeanUtil.getBeanDesc(...) to obtain validated PropDesc entries instead of deriving names manually.","Catch IllegalArgumentException for non-accessor methods when iterating."],"exampleFix":"// before\nString field = BeanUtil.getFieldName(method.getName()); // may throw\n// after\nString name = method.getName();\nString field = (name.startsWith(\"get\")||name.startsWith(\"set\")||name.startsWith(\"is\"))\n    ? BeanUtil.getFieldName(name) : null;","handlingStrategy":"type-guard","validationCode":"static boolean isAccessor(String n) { return (n.startsWith(\"get\")||n.startsWith(\"set\")) && n.length()>3 || (n.startsWith(\"is\") && n.length()>2); }","typeGuard":"static boolean isAccessorName(String n) { return n != null && (n.startsWith(\"get\")||n.startsWith(\"set\")||n.startsWith(\"is\")) && n.length() > (n.startsWith(\"is\")?2:3); }","tryCatchPattern":null,"preventionTips":["Filter methods to accessors before calling getFieldName.","Prefer BeanUtil.getBeanDesc for validated property iteration."],"tags":["bean","reflection","argument-validation"],"backgroundTag":null,"analyzedSha":"8870454b2a0c29cc6ffd31dcf5667c8ceb2fc442","analyzedAt":"2026-08-14T04:01:12.892Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}