Solved

Dynamically load a class

Posted on 2007-03-31
3
186 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:Mayank S
Mayank S earned 200 total points
ID: 18831347
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
ID: 18836872
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
ID: 19169596
Whoops, forgot about this question. Both of you were very helpful on this issue. Thanks.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Which is the latest version of Apache Tomcatl 3 50
Requested array size exceeds VM limit 3 84
mockito example issue 8 62
what is a "java.lang.System Property"   ? 20 57
An old method to applying the Singleton pattern in your Java code is to check if a static instance, defined in the same class that needs to be instantiated once and only once, is null and then create a new instance; otherwise, the pre-existing insta…
Java Flight Recorder and Java Mission Control together create a complete tool chain to continuously collect low level and detailed runtime information enabling after-the-fact incident analysis. Java Flight Recorder is a profiling and event collectio…
Viewers learn how to read error messages and identify possible mistakes that could cause hours of frustration. Coding is as much about debugging your code as it is about writing it. Define Error Message: Line Numbers: Type of Error: Break Down…
This video teaches viewers about errors in exception handling.

910 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

18 Experts available now in Live!

Get 1:1 Help Now