- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我可以使用 getMethods()
方法访问 IType
的所有方法。是否有一种有效的方法来确定这样的 IMethod
是访问器还是修改器(getter/setter)?
检查 IMethod
的名称是否匹配方案 prefix + NameOfAttribute
with prefix ∈ {"get", "set", "is"}
会帮助我检测明显的那些,但如果访问器或修改器(getter/setter)不是这样命名的,它就不会工作。
有没有更好的办法?
编辑:我只想识别直接获取/设置 IType
属性的 getter/setter 方法,不做任何其他事情。
EDIT2:使用的技术术语:accessor & mutator
EDIT3:这是我阅读所有答案后的解决方案:
private boolean isAccessor(IMethod method) throws JavaModelException {
if (isAccessMethod("get", method) || isAccessMethod("is", method)) { // if name fits
return method.getNumberOfParameters() == 0 && !Signature.SIG_VOID.equals(method.getReturnType());
}
return false;
}
private boolean isMutator(IMethod method) throws JavaModelException {
if (isAccessMethod("set", method)) { // if name fits
return method.getNumberOfParameters() == 1 && Signature.SIG_VOID.equals(method.getReturnType());
}
return false;
}
private boolean isAccessMethod(String prefix, IMethod method) throws JavaModelException {
IType type = method.getDeclaringType();
for (IField field : type.getFields()) { // for ever field of IType:
if (method.getElementName().equalsIgnoreCase(prefix + field.getElementName())) {
return true; // is access method if name scheme fits for one field
}
}
return false; // is not an access method if no field fits
}
重要提示:此解决方案符合我的要求,但忽略了一些重要情况(请参阅 accepted answer)。这仍然不检查该方法的功能,但它工作得很好。它检查我提出的方案的方法名称。但它还会检查参数计数以及返回类型是否为 void
。如果有人想对此进行改进,他还可以检查 getter 的返回/参数类型是否与与方法名称匹配的字段类型相匹配。
最佳答案
我猜 JDT 核心不支持识别 getter 和 setter。
JDT 中只有一个公共(public) API 提供基于字段名称的 getter/setter 名称生成。例如。 NamingConvention
看看 suggestGetterName()
方法。
其他内部类,如 GetterSetterUtil
也不要提供你想要的方法。
最后我会自己创建一个属性访问器检测器。也许作为一个过滤器,我可以在 Collection
上应用
Checking if the name of an IMethod matches the scheme prefix + NameOfAttribute with prefix ∈ {"get", "set"}
同时检查 is
如果是 boolean 属性和方法的参数列表,则为前缀。 Getters 通常不带参数,而 setter 通常带一个参数。我说通常,因为 JavaBeans specification还允许索引属性。例如
void setter(int index, PropertyType value); // indexed setter
PropertyType getter(int index); // indexed getter
void setter(PropertyType values[]); // array setter
PropertyType[] getter(); // array getter
编辑
I added my own solution based on your proposals to my post.
您的解决方案可能符合您的要求。请记住,属性可能没有直接的支持字段。属性的概念有点抽象。我的意思是,如果您有一个名为 visible
的属性和 setter/getter isVisible()
该类可能没有字段 private boolean visible
.
为了清楚起见,您应该查看属性 rootPane
来自 JComponent
.这绝对是一个属性,因为 Introspector
返回它。
BeanInfo jcomponentBeanInfo = Introspector.getBeanInfo(JComponent.class);
PropertyDescriptor[] propertyDescriptors = jcomponentBeanInfo.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; i++) {
PropertyDescriptor propertyDescriptor = propertyDescriptors[i];
if("rootPane".equals(propertyDescriptor.getName())){
System.out.println("Found property rootPane");
break;
}
}
会打印出来
Found property rootPane
但如果您看一下实现,它不会使用直接的支持字段。
public JRootPane getRootPane() {
return SwingUtilities.getRootPane(this);
}
和SwingUtilities.getRootPane
public static JRootPane getRootPane(Component c) {
if (c instanceof RootPaneContainer) {
return ((RootPaneContainer)c).getRootPane();
}
for( ; c != null; c = c.getParent()) {
if (c instanceof JRootPane) {
return (JRootPane)c;
}
}
return null;
}
我只是想更清楚地说明这一点。
关于java - 识别 IType 的所有 IMethods 的访问器和修改器(getters/setters),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41738462/
在 Eclipse 插件中,假设我持有 Java 类的 IJavaElement(也是 IType) org.eclipse.jdt.core.IType 如何获取其父类(super class)的
我目前正在研究基于 JDT 的自定义重构工具。有一次,我想找到一种类型的所有子类型,就像 eclipse 中的“类型层次结构” View 一样。我使用搜索引擎编写了一个遍历层次结构的递归函数。这有效,
有没有一种好方法可以访问 IType 的导入声明,而无需手动搜索源代码,可以使用 getSource() 获取 String ? 示例:如果 IType 是源文件中的 Java 类: import j
我想知道 Eclipse JDT 是否提供任何 API 函数来从 IType 实例化对象。 我们使用 Eclipse JDT 搜索引擎来检索具有特定接口(interface)的类,例如 Applica
我有一个类的 IType 对象。我想知道该类是否是抽象类。IType 或 ICompilationUnit 中是否有任何可用的方法来确定相同的(反射除外)。 最佳答案 IType type = ...
我尝试执行以下操作: hibQuery.SetParameter("MyParameter", valueObject, valueType); 唯一的问题是此方法需要第三个参数中的 NHiberna
我正在开发一个插件,该插件采用工作区中实现某些接口(interface)(IDomain)的所有枚举解析代码(使用 AST)对枚举进行一些修改并将其标记为使用注释(@IDomainInfo)处理。 例
我有一个 Eclipse 插件项目,我在其中使用 org.eclipse.jdt.core.IField 、 org.eclipse.jdt.core.IType 等。现在我正在尝试在 Intelli
有没有一种简单直接的方法可以从类名中获取 IType?我认为某处一定有一些静态方法。基本上,我想做类似的事情: IType objectType = Somewhere.getType("java.l
我正在使用 AngularJS 1.6.4,我收到有关 $sce 的错误: Error: [$sce:itype] http://errors.angularjs.org/1.6.4/$sce/ity
我目前正在编写单元测试并使用 Moq 框架模拟依赖项。为此,我创建了一个 Mock,如下所示: Mock traceProviderMock = new Mock(); traceProviderMo
我有这样的代码: using System; using System.Collections.Generic; using System.Linq; public interface IMyStri
我可以使用 getMethods() 方法访问 IType 的所有方法。是否有一种有效的方法来确定这样的 IMethod 是访问器还是修改器(getter/setter)? 检查 IMethod 的名
我想播放存储在我的帆服务器中的歌曲。路径是 http://localhost:4000/images/123.mp3 . 在前端,我使用 ng-repeat 列出来自服务器的歌曲。
我正在尝试在 angularjs 中使用它们的 unicodes 显示货币符号。我创建了一个 unicode 数组,并使用 ng-repeat 来显示每个货币符号。我还使用了严格的上下文转义,但我收到
我是一名优秀的程序员,十分优秀!