Toon posts:

[Java] Reflection *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hopelijk heeft er hier iemand ervaring met reflection, want ik zit namelijk met het volgende probleem.

Ik wil vanuit mijn java instantie een ander java proggie opstarten. Zolang die andere klass zich in dezelfde dir bevind als de initiator gaat alles goed... maar zodra ik 'm vanuit een andere dir moet laden krijg ik een exception...

hier de code en de exceptie:
ReflectionTest.java:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.lang.reflect.*;
import java.net.*;
import java.io.*;

class ReflectionTest
{
    ReflectionTest(String classFile, String classDir)
    {
        try
        {
            URLClassLoader clsLoader = new URLClassLoader(new URL[]{new URL("file:/" + classDir)});
            Class c = clsLoader.loadClass(classFile);

            Class argClass = String[].class;
            Method mainMeth = c.getMethod("main", new Class[]{argClass});

            String[] args = {"tja"};
            mainMeth.invoke(null, new Object[]{args});
        }
        catch(Exception e){ e.printStackTrace(); }
    }

    public static void main(String[] args)
    {
        new ReflectionTest(args[0], args[1]);
    }
}

/*
Test.class staat in dezelfde dir als deze class en dan gaat alles goed
  java ReflectionTest Test ./
  
Main.class in C:/windows/desktop/tmpTest/Bal/ gaat verkeerd...
  java ReflectionTest Main C:/windows/desktop/tmpTest/Bal/

De exception is:
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at Main.<init>(Main.java:27)
        at ReflectionTest.main(ReflectionTest.java:25)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
        at Main.main(Main.java:51)
        ... 6 more
*/


// edit: hmmz, [java] in de topictitel vergeten :(

[ Voor 7% gewijzigd door Verwijderd op 30-03-2004 17:07 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Wat voor code staat op regel 51?

code:
1
2
java.lang.ArrayIndexOutOfBoundsException: 0
        at Main.main(Main.java:51)


[edit]
Ik denk dat je niet genoeg argumenten meegeeft aan je main functie. Je moet je precondities controleren:

code:
1
2
3
4
5
main(String[] args){
    if(args.length <> 1 ) throw new IllegalArgumentException("");

    ...
}

[ Voor 49% gewijzigd door Alarmnummer op 30-03-2004 17:04 ]


Verwijderd

Topicstarter
tja, die heeft eigenlijk maar 36 regels...
maar daar ligt 't niet echt aan, want als die zich in dezelfde dir als de initiator bevind gaat alles wel goed...

Main.java:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.awt.Frame;
import java.awt.event.WindowListener;
import java.awt.event.WindowEvent;

public class Main extends Frame implements WindowListener
{
    public Main()
    {
        setLayout(null);
        setBounds(50,50,300,300);
        addWindowListener(this);

        Ball ball = new Ball();
        add(ball);

        show();
    }

    public static void main(String[] args)
    {
        new Main();
    }

    public void windowOpened     (WindowEvent evt) {}
    public void windowActivated  (WindowEvent evt) {}
    public void windowClosed     (WindowEvent evt) {}
    public void windowDeactivated(WindowEvent evt) {}
    public void windowDeiconified(WindowEvent evt) {}
    public void windowIconified  (WindowEvent evt) {}
    public void windowClosing    (WindowEvent evt)
    {
        dispose();
        System.exit(0);
    }
}

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Oeps.. ik zat helemaal bij de verkeerde java file te prutsen :P

*schenkt zichzelf ff verse bak leut in*

[ Voor 8% gewijzigd door Alarmnummer op 30-03-2004 17:15 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Uhm
Java:
1
2
3
4
    public static void main(String[] args) 
    { 
        new Main(args[0], args[1]); 
    }


Bedoel je daar niet: new ReflectionTest (...) ?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
ja dat bedoelde ik daar idd ja... kwam door foutje... had al mijn gepruts ff gefatsoeneerd in een nieuwe klasse ;) maar ik heb het probleem gelukkig nu inmiddels wel gelocaliseerd ;)

dat met die andere main blijft ie wijgeren... maarrrr, gelukkig doet ie 't wel moet een klale Main als:
Java:
1
2
3
4
5
6
7
8
9
10
11
public class Main
{
    public Main()
    {
    }

    public static void main(String[] args)
    {
        System.out.println("Hoi");
    }
}


dus nog ff verder prutsen waarom ie 't niet met die andere Main wil doen en klaar is kees ;)

[ Voor 83% gewijzigd door Verwijderd op 30-03-2004 17:16 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

wat is de target exception?
(Je hebt toch wel eerst naar de documentatie van InvocationTargetException gekeken he?)

[ Voor 63% gewijzigd door .oisyn op 30-03-2004 17:20 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

.oisyn schreef op 30 maart 2004 @ 17:19:
wat is de target exception?
(Je hebt toch wel eerst naar de documentatie van InvocationTargetException gekeken he?)
Die krijg je al een invocation niet is gelukt lijkt me, maar het gaat om de oorzaak van die foutmelding. Je moet dus altijd helemaal onderaan de stacktrace kijken om de oorzaak te achterhalen, en dat is hier die ArrayIndexOutOfBoundsException

Verwijderd

Topicstarter
die target exception was die:
java.lang.ArrayIndexOutOfBoundsException: 0

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Alarmnummer schreef op 30 maart 2004 @ 17:30:
[...]

Die krijg je al een invocation niet is gelukt lijkt me, maar het gaat om de oorzaak van die foutmelding. Je moet dus altijd helemaal onderaan de stacktrace kijken om de oorzaak te achterhalen, en dat is hier die ArrayIndexOutOfBoundsException
bron
Throws:
[...]
InvocationTargetException - if the underlying method throws an exception.
InvocationTargetException is a checked exception that wraps an exception thrown by an invoked method or constructor.
Een InvocationTargetException wil dus zeggen dat er een (normale) exception gegooid is tijdens het aanroepen van de methode. De target exception geeft aan wat deze exception is
Verwijderd schreef op 30 maart 2004 @ 17:30:
die target exception was die:
java.lang.ArrayIndexOutOfBoundsException: 0
kun je daar geen stacktrace bij printen?

[ Voor 17% gewijzigd door .oisyn op 30-03-2004 17:45 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

.oisyn schreef op 30 maart 2004 @ 17:43:
Een InvocationTargetException wil dus zeggen dat er een (normale) exception gegooid is tijdens het aanroepen van de methode. De target exception geeft aan wat deze exception is
Idd.. De ArrayIndexOutOfBoundsException
kun je daar geen stacktrace bij printen?
Dat heeft hij.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Argh wat stom, daar had ik totaal overheen gelezen 8)7
Wel raar, pakt ie dan niet gewoon de verkeerde Main klasse oid? Heb je 'm misschien onlangs aangepast en ben je 'm vergeten te compilen?

[ Voor 57% gewijzigd door .oisyn op 30-03-2004 17:48 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

.oisyn schreef op 30 maart 2004 @ 17:46:
Argh wat stom, daar had ik totaal overheen gelezen 8)7
*Schenkt oisyn ook maar een kop koffie in*

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

je hebt een java.lang.ArrayIndexOutOfBoundsException: 0 oftewel een Array die volledig leeg is.


dat kan alleen maar deze zijn toch: Method mainMeth = c.getMethod("main", new Class[]{argClass});

maar hier: public static void main(String[] args)
{
new Main();
}

doe je geen dingen met de array. Dus waarschijnlijk voert hij deze method uit:
public static void main(String[] args)
{
new ReflectionTest(args[0], args[1]);
}

Trace je code eens met de debugger?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

:?
Volgens mij klopt daar niets van (no offense, leet iso engine coder ;))

Ten eerste is de lengte van de array die hij meegeeft 1, met de string "tja"
Java:
1
2
            String[] args = {"tja"}; 
            mainMeth.invoke(null, new Object[]{args}); 


En hoe zou hij bij de main method van z'n ReflectionTest applicatie komen als ie die van Main query'd?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

De array is leeg, anders zou je geen andere foutmelding krijgen ;)
Waarom ie leeg is, is een andere vraag ;)

Misschien heeft het er mee te maken dat je door de main aan te roepen een andere JVM opstart? Probeer eens een andere funcite dan main aan te roepen?

[ Voor 10% gewijzigd door wasigh op 30-03-2004 23:01 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoals ie hier zegt, werkt een lege main wel op de een of andere manier. Ik blijf die regel 51 ook heel erg vreemd vinden, ik blijf bij m'n eerdere opmerking, volgens mij is de class die wordt geladen niet de class die gemaakt wordt uit de source die hij hier gepost heeft

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Het rare voor mij is dat hij een ArrayIndexOutOfBounds krijgt terwijl hij in die functie helemaal geen aanroep doet naar een element uit de array.

Maar dan nog: met een aantal strategisch geplaatste System.out.println's moet je er toch een heel eind uit moetne komen wat er precies gebeurd....

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 06:52
Wat ik vermoed is dat er een verkeerde class wordt geladen.
Een url naar een file onder windows is alsvolgt:
file:///c:/bla/bla/bla (idd 3 slashes, 2 die standaard in de url zitten en 1 voor de root)

Probeer die Main.class eens te hernoemen naar een wat minder algemene naam.


offtopic:
druk met afstuderen dus? ;) succes!

Verwijderd

Topicstarter
doe je geen dingen met de array. Dus waarschijnlijk voert hij deze method uit:
public static void main(String[] args)
{
new ReflectionTest(args[0], args[1]);
}
dat is me idd ook een paar keer overkomen ja... heb er inmiddels zoveel mee zitten klieren...
Misschien heeft het er mee te maken dat je door de main aan te roepen een andere JVM opstart?
volgens mij gebruik ik de classloader van de applicatie die al draait, dan blijft 't dus binnen dezelfde JVM
volgens mij is de class die wordt geladen niet de class die gemaakt wordt uit de source die hij hier gepost heeft
schenkt ook maar een bakkie leut voor zichzelf in... is me idd een paar keer overkomen ja...
Een url naar een file onder windows is alsvolgt
je hebt gelijk ! en ja ik ben lekker bezig met afstuderen ja ;)


inmiddels heb ik ook niet stil gezeten. ik was vergeten dat er in de Bal klasse ook reflection wordt toegepast. Oftewel ik roep met reflection een main klass aan die allerlei klasses instantieerd, en die gaan dan zelf ook weer lekker met reflection bezig. alleen kunnen die de benodigde bestanden niet vinden omdat er van de directory van de initiator wordt uitgegaan...
(snappen jullie 't nog :P)
oftewel m'n bovenstaande voorbeeld klopt wel, maar de applicatie die ik opstart niet... maar ik denk nu ik met al jullie help er d'r nu wel uit kom ;)

nog bedankt mensen !

[ Voor 2% gewijzigd door Verwijderd op 31-03-2004 10:26 . Reden: typo ]

Pagina: 1