首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取一个类中某个属性的所有访问器方法?

如何获取一个类中某个属性的所有访问器方法?
EN

Stack Overflow用户
提问于 2013-04-03 12:20:38
回答 3查看 3.3K关注 0票数 0

我想检索Java类中给定属性的所有访问器。我已经尝试了一些方法,但它没有给出我期望的输出。例如:

代码语言:javascript
复制
public class demo {
    private String abc;

    public String getAbc() {
        return abc;
    }

    public void setAbc(String abc) {
        this.abc = abc;
    }

    public String fetchAbc() {
        return abc;
    }
}

在这里,abc属性有两个getter,我希望在我的项目中找到这三个实例。我尝试了下面的代码,它使用了BeanInfo应用程序接口,但它只给了我一个访问器:

代码语言:javascript
复制
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

public class BeanDemo {

    public void myMethod() throws IntrospectionException {
        BeanInfo beanInfo = Introspector.getBeanInfo(demo.class);

        for (PropertyDescriptor property : beanInfo.getPropertyDescriptors()) {
            //all attributes of class.
            property.getReadMethod(); // getter
            property.getWriteMethod(); // setter
        }
    }
}

有没有人能说出是否有其他API可以用来实现这一点呢?我可以玩倒影,但这不是正确的方式。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-04-03 12:27:49

我会鼓励你“玩倒影”,因为这正是正确的方式。

启动,一般用于反射,或,用于类。您可能还会发现很有用。

这里给你一个提示:

代码语言:javascript
复制
Method[] methods = demo.class.getMethods();
for (int i=0; i<methods.length; i++) {
    Method method = methods[i];
    // Take a look at the Method documentation to find out more:
    // http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html

    // Or, look at the Method tutorial here:
    // http://docs.oracle.com/javase/tutorial/reflect/member/method.html
}

至少看看Class classMethod class吧。

票数 0
EN

Stack Overflow用户

发布于 2013-04-03 12:36:22

首先:following JavaBean conventions is helpful.如果你有一个方法说是"retrieve“,但它是一个实际的getter方法,那么它比Java语言更令人困惑--为什么要有不止一种方法来获取字段呢?

第二:反射是你的朋友。你可以很轻松地反射出一个对象的信息,然后检索你想要的结果。你应该看看the Reflection Trail,因为它包含了大量有用的信息来帮助你入门。

下面是一个小示例-它将获得这个类中标记为" get“的所有方法。

代码语言:javascript
复制
public class StackOverflow {
    public static void main(String[] args) throws ClassNotFoundException {
        Method[] methods = Class.forName("Fake").getMethods();
        for(Method m : methods) {
            if(!m.getDeclaringClass().equals(Object.class) && m.toGenericString().contains("get")) {
                System.out.println(m.toGenericString());
            }
        }
    }
}

class Fake {
    private String objField;
    private int primitiveField;
    private boolean[] arrayField;

    public void setObjField(final String theObjField) {
        objField = theObjField;
    }

    public void setPrimitiveField(final int thePrimitiveField) {
        primitiveField = thePrimitiveField;
    }

    public void setArrayField(final boolean[] theArrayField) {
        arrayField = theArrayField;
    }

    public String getObjField() {
        return objField;
    }

    public int getPrimitiveField() {
        return primitiveField;
    }

    public boolean[] getArrayField() {
        return arrayField;
    }
}

上面的输出:

代码语言:javascript
复制
public java.lang.String Fake.getObjField()
public int Fake.getPrimitiveField()
public boolean[] Fake.getArrayField()
票数 0
EN

Stack Overflow用户

发布于 2013-04-03 12:50:44

反射只会查看方法的名称和签名,而不会查看它们实际做了什么。因此,您能否在此基础上可靠地识别get/set?

您可以识别所有字段: aaa、bbb等,然后查找其签名看起来像访问器、名称包含aaa或bbb等的所有方法。因此,您可能会找到getAaa()、setBbb()和fetchAaa(),甚至可能还有bbbFetcher(),但您不能确定这些方法是否真的是您正在寻找的。即使你要扫描源代码,也是很棘手的:

代码语言:javascript
复制
getMagnitude() { return squareRoot( x squared plus y squared) } 

那是个吸入器吗?

底线:字段和方法名称的模式匹配将为您提供候选,但您必须设计适合您需求的匹配规则。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15778801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档