如何在Java中将String值转换为对象引用?

rdlzhqv9  于 2023-06-28  发布在  Java
关注(0)|答案(2)|浏览(119)

我目前正在使用一个非常简单的客户端-服务器连接。客户端和服务器通过套接字连接,并使用流进行通信。
现在我希望客户端能够调用服务器上的方法。因此,客户端应该向服务器发送消息。然后将此消息拆分为两个字符串。第一个字符串methodName包含要调用的方法的名称。第二个字符串objectName包含一个对象的名称,该方法应在该对象上调用。
一种方法是使用像if(methodName.equals("mymethod")){mymethod()};这样的if语句。这个方法工作得很好,可以扩展到检查objectName。我仍然对这个解决方案非常不满意。我希望能够在许多不同的对象上调用许多不同的方法(甚至在还不存在的对象上)。我只是不想写成千上万的如果声明或案例。
这就是为什么我试图找到一种不同的方法。我已经找到了methodName的部分解决方案:
java.lang.reflect.Method method = myObject.getClass().getMethod(methodName);
method.invoke(myObject);
这将有效地将methodName的String值转换为对相应方法的引用。这正是我想要的。
但它带来了一个问题,即这两个指令都需要对象引用。到目前为止,该引用的“name”仍然存储在objectName中,最重要的是,它是一个String值,而不是一个引用。我现在要找的是这样的指令:
Object myObject = turnTheStringValueIntoAReference(objectName);
现在,我们可以假设已经存在一个对象引用,其名称存储在objectName中。否则,也可能有一种方法可以这样做:
Object turnTheStringValueIntoAReference(objectName) = new Object();
我尽了最大的努力去寻找一种方法来把一个字符串值转换成一个对象引用,但遗憾的是,我找不到任何解决方案。我现在已经达到了我认为这个“特性”故意不存在于Java中的地步,因为它基本上会消除类型安全。更不用说可能发生的所有异常。
然而,如果有人能告诉我是否真的有办法做到这一点,我仍然会非常高兴和非常感激。也许我只是还没想明白
随着进一步的研究,我发现RMI可能是一个替代方案。我想RMI甚至会是一个更好的方式。我仍然不想RMI的原因是,我计划扩展服务器的方式,它不仅接受我自己的客户端,而且还接受用不同语言编写的客户端。我认为,如果客户端只需要发送一条消息,那么管理这一点会比在不使用Java编写的情况下以某种方式支持Java RMI更容易。
好吧,我想就这样了。我真的很感激你的帮助。

tf7tbtn2

tf7tbtn21#

我现在已经达到了我认为这个“特性”故意不存在于Java中的地步,因为它基本上会消除类型安全。
你说得对。在Java中,没有办法访问变量名--至少没有访问局部变量名的方法。您至少可以使用getField(fieldName)访问字段,但这仍然是一个糟糕的想法。
你真的应该研究现有的解决方案,以原则性的、跨语言的方式解决这些问题。任何RPC或REST系统都是一个好的开始。这不是一个你必须发明自己的解决方案的领域。

0yg35tkg

0yg35tkg2#

以下是一个示例,说明您可以实现哪些功能:
联系人:

package reflection;

public class Person {

    private final String firstName;
    private final String lastName;

    public Person() {
        this("Tom", "Jones");
    }

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }
}

联系地址:

package reflection;

public class Address {

    private final String street;
    private final String city;
    private final String state;
    private final String zip;

    public Address() {
        this("100 Fifth Avenue", "New York", "NY", "10003");
    }

    public Address(String street, String city, String state, String zip) {
        this.street = street;
        this.city = city;
        this.state = state;
        this.zip = zip;
    }

    public String getStreet() {
        return street;
    }

    public String getCity() {
        return city;
    }

    public String getState() {
        return state;
    }

    public String getZip() {
        return zip;
    }
}

反射样本:

package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @link https://stackoverflow.com/questions/76567190/how-to-turn-a-string-value-into-a-object-reference-in-java?noredirect=1#comment134999266_76567190
 * @link https://stackoverflow.com/questions/1782598/with-java-reflection-how-to-instantiate-a-new-object-then-call-a-method-on-it
 */
public class ReflectionSample {

    public static void main(String[] args) {
        if (args.length > 1) {
            String className = args[0];
            String methodName = args[1];
            try {
                Constructor<?> defaultConstructor = Class.forName(className).getConstructor();
                Object instance = defaultConstructor.newInstance();
                Method method = instance.getClass().getMethod(methodName);
                System.out.println(method.invoke(instance));
            } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException |
                     InvocationTargetException e) {
                System.err.println(className + " class with method name " + methodName + " not found");
            }
        } else {
            System.out.println("Usage: reflection.ReflectionSample <class> <method>");
        }
    }
}

此示例将示例化PersonAddress的示例,并在该示例上调用我希望的方法。
但是你看到了这种方法中存在的问题。我不建议你走这条路。你高估了客户对灵活性的要求。

相关问题