Solved

Dynamically load a class

Posted on 2007-03-31
3
185 Views
Last Modified: 2013-11-23
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
Comment
Question by:NetworkArchitek
3 Comments
 
LVL 30

Assisted Solution

by:mayankeagle
mayankeagle earned 200 total points
Comment Utility
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
 
LVL 3

Accepted Solution

by:
cavey_79 earned 300 total points
Comment Utility
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
 
LVL 10

Author Comment

by:NetworkArchitek
Comment Utility
Whoops, forgot about this question. Both of you were very helpful on this issue. Thanks.
0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

For customizing the look of your lightweight component and making it look opaque like it was made of plastic.  This tip assumes your component to be of rectangular shape and completely opaque.   (CODE)
For beginner Java programmers or at least those new to the Eclipse IDE, the following tutorial will show some (four) ways in which you can import your Java projects to your Eclipse workbench. Introduction While learning Java can be done with…
This tutorial covers a practical example of lazy loading technique and early loading technique in a Singleton Design Pattern.
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now