我正在制作一个使用Drools计划器的应用程序。
@ValueRangeFromSolutionProperty
应该引用另一个类的属性(在这种情况下为NQueens
)。来自JavaDocs for @ValueRangeFromSolutionProperty:
propertyName
The property name of which exists a getter on the Solution that returns a Collection.
但我注意到不一致:注释器使用rowList
中的属性NQueens
。但是rowList
(而不是RowList
)是一个私有变量(请参阅下面的代码段)。如果它应该通过内省来推断属性(来自它的getter和setter方法),那么它是不是像RowList
那样拼写为getRowList()
?
问题: Java如何从getter方法推断(内省)属性名称(case和all)?
或者@ValueRangeFromSolutionProperty
是否直接访问私有变量 ?
背景细节:
从Queen.java
,代表棋盘上的女王的类:
public class Queen extends AbstractPersistable {
....
@ValueRangeFromSolutionProperty(propertyName = "rowList")
public Row getRow() {
return row;
....
来自NQueens.java
,@ValueRangeFromSolutionProperty
获取其属性的类:
public class NQueens extends AbstractPersistable implements Solution<SimpleScore> {
...
private List<Column> columnList;
private List<Row> rowList;
....
public List<Row> getRowList() {
return rowList;
...
答案 0 :(得分:14)
JavaBeans Specification表示对于属性propertyName
,应该有一个getter方法getPropertyName()
和/或一个setter方法setPropertyName()
。
属性由getter和setter方法的唯一存在定义,也可以是计算值。不需要对象上的实例变量。
规范定义了属性和getter / setter方法的大小写规则:
因此,当我们从中间提取属性或事件名称时 现有的Java名称,我们通常将第一个字符转换为较低的 案件。但是,为了支持偶尔使用所有大写名称, 我们检查名称的前两个字符是否都是大写 如果是这样的话,请不要管它。例如,
“FooBah”变为“fooBah”,“Z”变为“z”,“URL”变为“URL
该方法实际上实现为:
/*
Utility method to take a string and convert it to normal Java variable name
capitalization. This normally means converting the first character from upper case to
lower case, but in the (unusual) special case when there is more than one character
and both the first and second characters are upper case, we leave it alone.
Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays as "URL".
Parameters:
name The string to be decapitalized.
Returns:
The decapitalized version of the string.
*/
public static String decapitalize(String name) {
if (name == null || name.length() == 0) {
return name;
}
if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
Character.isUpperCase(name.charAt(0))){
return name;
}
char chars[] = name.toCharArray();
chars[0] = Character.toLowerCase(chars[0]);
return new String(chars);
}
所以:
name
为null,则返回name
的前两个字符有大写字母,请按原样返回答案 1 :(得分:3)
这是由JavaBeans命名约定定义的。 getter名称将包含“get”,后跟属性名称,首字母大写。
答案 2 :(得分:0)
当javabeans引用“属性”时,它是带有get()和set()方法的东西。它并不关心数据的内部存储是什么(如果有的话)。
因此,属性“foo”具有访问方法getFoo()和setFoo(),这些方法的作用与属性的定义无关。
http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html