如何在同一个JVM中用其他应用程序创建已加载类的实例?

时间:2013-10-28 14:20:56

标签: java reflection

我在Netbeans IDE中创建了两个小型Java应用程序,Say

App1 的课程第一如下

public class First{

  public static void main(String... str){
    First f = new First();
    System.out.print(f.getValue());
  }

  public int getValue(){
    return 10;
  }
}

App2 的课程第二如下

public class Second {
  public static void main(String... str){
    try{
      Class myClass = Class.forName("App1.First");
      Method m = myClass.getDeclaredMethod("getValue",new Class[] {});
      Object result = m.invoke(myClass,null);
      System.out.println(result);
    }catch(Exception e){
      System.out.println(e);
    }
  }
}

我在Netbeans中运行了App1.First,之后我在Netbeans中运行了App2.Second。

  

OUTPUT: java.lang.ClassNotFoundException:App1.First

上面的代码不起作用。 我想从App2.second访问App1.First中的getValue方法。

  

我想知道我们是否可以从其他应用程序创建类的实例并在Java中执行它的方法?如果是,那么如何?
  考虑 SecurityManager 未运行。请让我知道我在代码中的错误或理解概念。

我们将非常感谢您的回复。

  

感谢所有回复。如果Netbeans在不同的JVM中运行每个应用程序,那么我可以知道如何在JVM中运行其他应用程序已经运行的应用程序吗?

4 个答案:

答案 0 :(得分:2)

不,你不能。

每个应用程序都有自己的JVM,它有自己的类路径,加载的类等。你不能(在纯Java中)直接从另一个类访问一个JVM的类。

您需要做的是将App1的类放在App2的类路径上 - 有maven之类的工具可以帮助您设置这些依赖项。如果这样做,两个JVM都将拥有每个类的单独副本;您可以确保两个副本完全相同(例如,确保每次重新部署App1时都重新部署App2)。您还需要为JVM设置一些相互通信的方式:设置套接字或类似方法,使用序列化格式(序列化类,protobufs等),两者都达成一致。 / p>

答案 1 :(得分:1)

首先。 当您启动2个不同的程序时,您有2个不同的JVM实例。每个JVM对另一个都不了解。

二。 当class不包含在classpath中时发生异常。您必须为项目App1添加依赖项App2,即将类App1放入类路径App2

答案 2 :(得分:1)

如果App1和App2是两个不同的应用程序/项目,除非包含在类路径中,否则App2将不会看到APP1的类。

答案 3 :(得分:1)

每个应用程序在使用java命令运行时,都会在不同的JVM中启动。所以你不能在同一个JVM中使用这种方式加载类