Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / December 2005

Tip: Looking for answers? Try searching our database.

Executing a compiled class' main  from another class

Thread view: 
Meidan - 14 Dec 2005 17:47 GMT
Hi all,

Can I execute programmaticlly the main of a class which I only the
.class file of?
Rhino - 14 Dec 2005 18:25 GMT
> Hi all,
>
> Can I execute programmaticlly the main of a class which I only the
> .class file of?

You can but do you really want to?

If you want to execute a file called Foo.class directly from the command
line, you automatically execute main() first (assuming Foo is an
application, not an applet). For example:

java Foo

will always execute the main() method first.

If you invoke Foo from a class called Bar, it will look like this:

=======================
public class Bar {

   Foo myFoo = new Foo();
}
========================

but the method called will be the appropriate Foo constructor (the one that
takes no parameters in this example) and not main().

It would be rather unusual to want to invoke the main() method of Foo from
Bar. Invoking some other method of Foo wouldn't be that unusual but main()
is typically only invoked by running Foo from the command line.

However, you could probably invoke main() via reflection if you really
wanted to. I believe it is somewhat expensive but it should be possible. I
don't have a link to a tutorial on Reflection handy but you should be able
to find one via Google if you really want to execute Foo's main from another
class.

Rhino
Gordon Beaton - 14 Dec 2005 18:57 GMT
> If you invoke Foo from a class called Bar, it will look like this:

Or even simpler:

 Foo.main(args);

No need for an instance, constructors or reflection.

/gordon

Signature

[  do not email me copies of your followups  ]
g o r d o n + n e w s @  b a l d e r 1 3 . s e

Meidan - 14 Dec 2005 19:04 GMT
> > If you invoke Foo from a class called Bar, it will look like this:
>
[quoted text clipped - 9 lines]
> [  do not email me copies of your followups  ]
> g o r d o n + n e w s @  b a l d e r 1 3 . s e

I already tried that.
But it wont compile - it says Foo cannot be resolved.
BartCr - 14 Dec 2005 19:10 GMT
Well, you'll need to make sure Foo is in the correct place in your
classpath when compiling
Meidan - 14 Dec 2005 19:15 GMT
> Well, you'll need to make sure Foo is in the correct place in your
> classpath when compiling

But I didn't compile Foo, I only have the .class.
zero - 14 Dec 2005 19:26 GMT
"Meidan" <meidan.alon@gmail.com> wrote in news:1134587714.717782.182840
@g14g2000cwa.googlegroups.com:

>> Well, you'll need to make sure Foo is in the correct place in your
>> classpath when compiling
>
> But I didn't compile Foo, I only have the .class.

Well, you'll need to make sure Foo is in the correct place in your
classpath when compiling Bar.

ie: javac -classpath path/to/Foo/ Bar.java

Signature

Beware the False Authority Syndrome

Thomas Okken - 14 Dec 2005 19:29 GMT
> But I didn't compile Foo, I only have the .class.

That's not a problem, all you need is the .class. But, it needs to be
in your classpath, so that the compiler can find it; the compiler needs
to see it so that it can check your code (e.g. to see whether or not
Foo contains a main() method, or else it won't be able to generate code
for the Foo.main() call).

Alternatively, use the reflection approach mentioned earlier:

try {
   Class c = Class.forName("Foo");
   String[] args = new String[] { "Hello", "world" };
   Method m = c.getMethod("main", new Class[] { args.getClass() });
   m.invoke(null, args);
} catch (Exception e) {
   // Possible exceptions include ClassNotFoundException,
   // NoSuchMethodException, InvocationTargetException
   e.printStackTrace();
}
Meidan - 14 Dec 2005 20:07 GMT
> > But I didn't compile Foo, I only have the .class.
>
[quoted text clipped - 16 lines]
>     e.printStackTrace();
> }

I get a  java.lang.ClassNotFoundException when Class.forName("Foo") is
executed.

I'm using Eclipse and I found in project properties the parameter "java
build path", I added to it the location of my .class file. But still no
luck.......
Gordon Beaton - 14 Dec 2005 20:40 GMT
> I get a java.lang.ClassNotFoundException when Class.forName("Foo")
> is executed.

So you've got classpath issues. Does "Foo" have a real name? Does it
belong to a package?

If so, the classpath should not point to the directory containing the
classfile. It should point to a directory containing a hierarchy of
directories that correspond to the component parts of the package name.

Learn more about the necessary relationship between the classpath and
the directory structure here:

http://www.yoda.arachsys.com/java/packages.html

Type "javap Foo" to see what the file contains if you don't already
know.

/gordon

Signature

[  do not email me copies of your followups  ]
g o r d o n + n e w s @  b a l d e r 1 3 . s e

Meidan - 15 Dec 2005 07:31 GMT
> > I get a java.lang.ClassNotFoundException when Class.forName("Foo")
> > is executed.
[quoted text clipped - 19 lines]
> [  do not email me copies of your followups  ]
> g o r d o n + n e w s @  b a l d e r 1 3 . s e

My file system structure is:
Exercise
  FruitGamePlayer
     .metadata(dir)
     Player
        .metadata
        .classpath
        .project
        Tester.java
        MyPlayer.java
        (and some more .class files for internal use in MyPlayer)

  FruitGamesServer
     .metadata(dir)
     GamesServer
         .project
         GameDefinition.class
         GameServerMain.class
         HandlingServers.class
         PlayerServer.class
  .classpath
  .project

What do I have to do in order to call GameServerMain.main() from
Tester.java?
Note that I can call it from the command line by java -classpath .;..
GameServerMain from within the GameServer Directory.
Meidan - 15 Dec 2005 08:19 GMT
The contents of my main .classpath file:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="FruitGamePlayer/Player"/>
    <classpathentry kind="src" path="FruitGameServer/GameServer"/>
    <classpathentry kind="con"
path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="con" path="FruitGameServer/GameServer"/>
    <classpathentry kind="con" path="FruitGameServer/GameServer"/>
    <classpathentry kind="output" path="FruitGamePlayer/Player"/>
    <classpathentry kind="output" path="FruitGameServer/GameServer"/>
</classpath>
zero - 14 Dec 2005 19:27 GMT
"BartCr" <bcremers@gmail.com> wrote in news:1134587444.240877.166390
@g14g2000cwa.googlegroups.com:

> Well, you'll need to make sure Foo is in the correct place in your
> classpath when compiling

Also make sure you import it if it's defined in a package.

Signature

Beware the False Authority Syndrome

Jeffrey Schwab - 14 Dec 2005 19:21 GMT
> Hi all,
>
> Can I execute programmaticlly the main of a class which I only the
> ..class file of?

// Yes.

import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

public class ClassMain {

        static PrintWriter err = new PrintWriter(System.err, true);

        public static void main(String[] args) {
                callMain(Helper.class, args);
        }

        static void callMain(Class c, Object args) {
                try {
                        Method m = c.getDeclaredMethod(
                                        "main", String[].class);

                        m.invoke(null, args);

                } catch(NoSuchMethodException x) {
                        err.println(x);
                } catch(IllegalAccessException x) {
                        err.println(x);
                } catch(InvocationTargetException x) {
                        err.println(x);
                }
        }
}

class Helper {

        static PrintWriter out = new PrintWriter(System.out, true);

        public static void main(String[] args) {
                out.println("Hello from Helper.");
        }
}
Roedy Green - 14 Dec 2005 23:42 GMT
>Can I execute programmaticlly the main of a class which I only the
>.class file of?

of course.  Most of the time you don't get source from the authors.
Signature

Canadian Mind Products, Roedy Green.
http://mindprod.com Java custom programming, consulting and coaching.



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.