我想编写一个应用程序,当部署在服务器上时,它会发现该服务器上的一些类及其方法,并将其列表(通过web服务,servlet或RMI)公开给客户端。
客户端可以选择一个方法并激活它(通过反射)。
问题是我的应用程序与服务器上的其他应用程序不在同一个上下文中,所以我不能激活它们的方法(我无法访问它们的类加载器)。
我有一些想法,但不确定它们是否可行:
-
创建一个jar并使服务器上的所有应用程序都知道它(通过manifest文件或通过将其放在服务器库中)-问题是,这样我就不能向客户端公开接口(也许我可以通过RMI?)
-
创建一个WAR并将所有应用程序链接到这个WAR,这样当它们启动时就会加载它(就像链接到一个jar) -据我所知这是不可能的。
-
是否有一个知道所有类的类加载器?有办法得到它吗?
-
分析器是怎么做的?
3) AFAIK应用程序服务器通常有一个类加载器层次结构,因此没有一个可以访问所有类的类加载器。事实上,你经常需要加载同一个类的多个实例,例如,当部署使用静态类变量或不同版本的类或库的独立应用程序时。下面是JBoss如何做到这一点的简短描述。
4)大多数分析器使用JVMTI。
但是,您应该记住,出于安全性、稳定性和性能的原因,不建议公开每个类和每个对象。用户是否能够调用内部类或基本类(如String
)上的方法?用户是否能够呼叫System.exit()
?我的回答是否定的,因此您需要定义一些方法来确定要公开的内容。最有可能的是一个更简单的解决方案(专用服务)将满足您的用例需求(您没有说明它们,所以这只是一个猜测)。