【问题标题】:Dynamic RMI method generation动态 RMI 方法生成
【发布时间】:2013-07-04 10:13:08
【问题描述】:

我必须开发通过 RMI 进行通信的客户端和服务器组件。

public interface Test {
  public String getInformation();
}

public class TestImpl implements Test {

    public String getInformation() {
        return “Hello”;
    }
}

这个 Test 接口可以在 RMI 客户端执行,但在 RMI 服务器中,这个 Test 接口和 TestImpl 类不可用,但是所有这些类名、方法名、参数、返回类型都可以作为元数据使用(保存在 DB 中)。我需要在服务器端虚拟生成 Test 和 TestImpl 类并将它们注入 RMI 服务器。我该怎么做?

【问题讨论】:

  • 试试 Spring 的依赖注入引擎。你在这里重新发明了很多轮子。
  • 定义。定义“动态 RMI 方法生成”。定义“虚拟生成”。定义为什么您显然需要测试不存在的服务。

标签: java dynamic classloader rmi


【解决方案1】:

如果您想生成 RMI 服务器类,从存储在 DB 中或以其他方式存储的类名、方法名、参数类型、返回类型等,您可以使用几个众所周知的字节中的任何一个- 代码检测工具,例如 ASM(最流行)、JavassistBCEL(JDK 至少从 1.5 版开始也提供嵌入式版本)。 (我不确定“虚拟”生成是什么意思,“虚拟”和“非虚拟”类生成有什么区别)。 注入,如果您的意思是像here 那样使用 java.rmi.registry.Registry 注册,生成类的实例是微不足道的,并且与任何其他 RMI 服务器的“注入”没有区别.

附带说明:您的设计似乎很不寻常。在数据库中存储类名、方法名等是一回事。另一个是所有这些信息都是在您的案例中在客户端定义的,而通常情况正好相反。 无论如何,如果您需要采用这种设计,那么,作为一种选择,您可以考虑将接口以 .class 文件的编译(二进制)形式存储在数据库中,而不是类名、方法名等的文本定义。在这种情况下,您不需要搞乱字节码生成,并且可以使用普通的 Java 反射 Proxy/InvocationHandler,或者最坏的情况是简单的 CGLIB 代理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多