IntelliJ Velocity 模板 $Character.isUpperCase return false on uppercase char

IntelliJ Velocity template $Character.isUpperCase return false on uppercase char

我正在尝试制作一个 setter 模板,它允许我为成员变量使用 m 前缀。因此,当我有一个字段 mTest 时,应该给我一个 setter:public setTest 而不是 setmTest。我认为我的逻辑是正确的,但是 Character.isUpperCase returns false 即使它是大写字母。我添加了一些即兴调试,因为测试起来有点奇怪,因为 IntelliJ 检查是否返回了正确的函数。生成 setter 时出现一个错误对话框,我可以在其中看到我的输出:

#if($Character.isUpperCase($paramName.charAt(1)))
  paramIsUppercase: $paramName.charAt(1)
#else
  paramIsNotUppercase: $paramName.charAt(1)
#end

完整代码:

#set($paramName = $helper.getParamName($field, $project))

// debugging
#if($Character.isUpperCase($paramName.charAt(1)))
  paramIsUppercase: $paramName.charAt(1)
#else
  paramIsNotUppercase: $paramName.charAt(1)
#end

#if($StringUtil.startsWith($paramName, 'm') && $Character.isUpperCase($paramName.charAt(1)))
    #set($paramName = $paramName.substring(1))
#end
#set($paramName = $StringUtil.decapitalize($paramName))
public ##
#if($field.modifierStatic)
static void ##
#else
  $classname ##
#end
set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($paramName))($field.type $paramName) {
#if ($field.name == $paramName)
  #if (!$field.modifierStatic)
  this.##
  #else
    $classname.##
  #end
#end
$field.name = $paramName;
#if(!$field.modifierStatic)
return this;
#end
}

当使用它为 mTest 创建 setter 时,我的调试出现错误

paramIsNotUppercase: T

为什么会返回 false,是否有解决方法?

看起来问题是 $Character 没有定义,这意味着表达式总是 return false。有一种方法可以解决这个问题。这是一个可怕的黑客,但它对我有用。使用以下模板行。

## get some object
#set($String='')
## abuse it to obtain the desired jdk class
#set($Character=$String.class.forName('java.lang.Character'))

之后您可以根据需要定期使用 $Character(即 $Character.isUpperCase($paramName.charAt(1)))。

但是,如果您想为字段使用前缀,则无需创建自己的 setter 模板。只需转到设置 文件 |设置 |编辑|代码风格 | Java |代码生成并为字段指定一个名称前缀,getters和setters将被正确生成。