如何通过名称作为字符串访问对象的字段/方法

时间:2016-03-02 17:24:10

标签: java swift

让我说我有一个班级

A a = new A();

为了简单起见,我们假设所有这些成员都是公共的并且访问它们我创建了该类的对象,如下所示

String string = "age"

a.string

有没有办法按如下方式访问每个成员

String string = "getAge()";
a.string;

并获取对象的年龄等。 同样地,让我说我有一个吸气剂,我可以使用

访问它
{{1}}

我是初学java程序员,试图优化用swift编写的代码(不用说我是swift的新手),它有一个包含50多个成员的类,并且在其他模块中设置/获取它们很乏味。

只是想知道这是否可以在任何一种编程语言中使用。在java中,我假设使用类反射这样的事情是可能的,但不是很确定。

3 个答案:

答案 0 :(得分:2)

好吧,您可以使用reflection,并执行以下操作:

A a = new A();
Class cls = a.getClass();

//read a method value
String methodName = "getAge";
Method method = cls.getDeclaredMethod(methodName);
int methodReturnedResult = method.invoke(a, null);

//read a field value
String fieldName = "age";
Field field = cls.getDeclaredField(fieldName);
int fieldValue = field.get(a);

This is another example
Java Reflection tutorial

虽然重要的是要注意反射不适用于这些情况, 被认为是在这些情况下使用反射的好设计。你需要做的是使用IDE的能力自动为你生成setter和getters 你使用哪个IDE?大多数Java IDE都能够根据类字段自动生成getter和setter。

这是您在EclipseNetbeansIntellijAndroid Studio中执行此操作的方式。

答案 1 :(得分:1)

正如here所解释的(带有示例),您可以使用java反射来检查类是否包含字段并获取该字段的值。

此外,将字段设为公开并不是一个好主意,它们应该是私有的,只能通过getter和setter访问。

答案 2 :(得分:0)

如果你必须使用折射,下面应该可行。

A类

class A {
    String name;
    int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

班上的实用工具

public Object get(String methodName, A a) throws Exception {
    Object ret = null;
    if(a != null){
        Class<A> cl = A.class;
        Method method = cl.getDeclaredMethod(methodName);
        ret = method.invoke(a);
    }
    return ret;
}

public void set(String methodName, Object value, A a) throws Exception{
    Class<A> cl = A.class;
    Method method = cl.getDeclaredMethod(methodName, value.getClass());
    method.invoke(a, value);

}

测试

public void testIt() throws Exception{
    A a = new A();
    set("setName", "xyz", a);
    String name = (String) get("getName",a);
    System.out.println(name);
}

注意:请注意盒装类型,即int表示为Integer。并且有大量的空检查。