[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 199
  • Last Modified:

Dynamically load a class

I kind of at a wall with this problem and need some help. If I could award more points I would. My issue is this:  I have a client-server system which is designed for others to extend. I have a a base interface, let's call it "MyRunnable." This interface has one method:  void run().      

I need to be able to allow someone to build their own client application to talk to my server (using Web Services). I need someone to, using my class library, construct a class that implements MyRunnable.and allow the server to invoke the run() method on an instance of that object.

Essentially, I believe I need to allow the ability have an instance of a MyRunnable object be serialized, sent to the Web Service, then the server deserialize it and invoke the method. But obviously, I need the class definition to be available to server and all of that.

I've looked at things like the ClassLoader and all of that but I need some guidance. I know this is non-trivial but hopefully someone can point me in the right direction. There is a project called JPPF (a grid computing project) which does something like this but it's implementation is far to complex/robust than what I need. So any help is appreciated.

Again, put simply: I need my library to allow for an object in one application X, that implements an interface known by another application Y, to have its class definition determined (and perhaps any non-built-in class definitions that it references) and its object state to be sent to application Y and have the methoid defined in the interface invoked.
0
NetworkArchitek
Asked:
NetworkArchitek
2 Solutions
 
Mayank SAssociate Director - Product EngineeringCommented:
unfortunately yes, you need the class to be present on both sides (client as well as server), if it has to be loaded at both the ends. However, you can still make your source code generic and agnostic of the class by making them depend on MyRunnable. Read this to get an idea of a sample implementation:

http://www.experts-exchange.com/Programming/Languages/Java/Q_21666226.html#15495977

All you need to do is ensure the JARs are present in the CLASSPATH on both sides, client as well as server.
0
 
cavey_79Commented:
You could get away with having the class only on one side. You could then send it over to the other side and dynamically load the class. Once that's done, you could play around with the class via reflection. You could even just create a new instance via reflection, cast it to your interface and then use it directly.

However, from an architecture point of view, I find your approach rather risky. I would rather go with a specified and restricted set of capabilities for the server and the clients would be able to use only those defined operations.

Getting the class file over the wire should be pretty simple (locating it might be a tad more complicated) and then loading it would be done with ClassLoader.defineClass (just get the classloader from one of the existing classes). Then on the newly created Class you would call newInstance, cast it to your interface and you're done. You just need to make sure you know how to create a new instance (for instance mandating that your clients have a default no-arg constructor).
0
 
NetworkArchitekAuthor Commented:
Whoops, forgot about this question. Both of you were very helpful on this issue. Thanks.
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now