tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
3356
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    y0dA y0dA ist offline Mitglied Brokat
    Registriert seit
    Mar 2007
    Beiträge
    263
    Hi!
    Ich versuche gerade ein externes Jar nachzuladen, nachladen dürfte funktionieren, jedoch gibt es wohl Verständnisprobleme wie ich nun eine Methode einer nachgeladenen Klasse benutzen kann.

    Code :
    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
    
    public void loadExternalLibary() {
            try {
                URL jarURL = new File(this.path + this.jar).toURL();
                ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
                
                if (classLoader != null && (classLoader instanceof URLClassLoader)) {
                    URLClassLoader urlClassLoader = (URLClassLoader) classLoader;
                     Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
                     addURL.setAccessible(true);
                     addURL.invoke(urlClassLoader, new Object[]{jarURL});
                     
                     Class tempClass = classLoader.loadClass(this.className);
                     /* check if class really implements needed interface */
                     Class[] interfaceArray = tempClass.getInterfaces();
                     for (int i = 0; i < interfaceArray.length; i++) {
                         if (interfaceArray[i].equals(ITrackParser.class)) {
                             /* external class implements needed interface */
                             this.c = tempClass;
                             break;
                         }
                     }
                     if (this.c == null) {
                         throw new Exception("external class " + this.className + " does not implement needed "
                                 + ITrackParser.class);
                     }  
                     
                     final String hh =
                            "C:\\work\\projects\\StreetDetection\\src\\main\\resources\\files\\20071207_1sekunde.LOG";
                     
                     Class[] parameterTypes = new Class[] {String.class};
                     Method m = this.c.getMethod("getReceiverId");
                     String ss = (String) m.invoke(this.c);
     
                }
    Hier bekomme ich bei invoke eine Exception:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    java.lang.IllegalArgumentException: object is not an instance of declaring class
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.pcd.wam.gegenstandsbereich.streetDetection.locating.controller.OfflineProcessor.loadExternalLibary(OfflineProcessor.java:117)
        at org.pcd.wam.test.TestOfflineProcessor.main(TestOfflineProcessor.java:16)

    Die nachgeladene Klasse sieht so aus:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    package org.pcd.wam.technologie.nmea.parser;
     
    import java.util.LinkedList;
    import java.util.List;
     
    import org.pcd.wam.gegenstandsbereich.streetDetection.locating.model.Track;
    import org.pcd.wam.gegenstandsbereich.streetDetection.locating.parser.ITrackParser;
     
    public class DummyParser implements ITrackParser {
     
        public String getReceiverId() {
            // TODO Auto-generated method stub
            return "dummy wert!";
        }
     
        public List<Track> getTracks(String s) {
            List<Track> tList = new LinkedList<Track>();
            Track t = new Track();
            t.setCmt("dummy wert");
            return tList;
        }
     
    }


    aufgerufen wird das ganze mit:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    public static void main(String[] args) {
            String path = "C:\\work\\";
            String jarName = "test.jar";
            String className = "org.parser.DummyParser";
     
            FileSystemProcessor f = new FileSystemProcessor(path, jarName, className);
            f.loadExternalLibary();
        }
    Kann mir jemand verraten was ich falsch mache bzw wie ich die Methoden getReceiverId und getTracks ansprechen kann per Reflection
    Geändert von y0dA (21.01.08 um 10:14 Uhr)
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    anstatt:
    Code java:
    1
    
    m.invoke(this.c);

    das hier:
    Code java:
    1
    
    m.invoke(this.c.newInstance());

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    y0dA y0dA ist offline Mitglied Brokat
    Registriert seit
    Mar 2007
    Beiträge
    263
    Sauber, danke!

    Jedoch verschließt sich mir hier der Sinn - heißt das im Klartext dass ich noch keine Instanz der Klasse hatte?

    mfg
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    Ja...

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

Ähnliche Themen

  1. Pluginsentwicklung + wie kann ich eine Progressbar ..:-) benutzen
    Von daniel38 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 19.11.10, 12:49
  2. Methode per reflection an delegate übergeben
    Von progo im Forum .NET Application und Service Design
    Antworten: 2
    Letzter Beitrag: 05.06.09, 20:00
  3. Antworten: 3
    Letzter Beitrag: 06.12.08, 22:04
  4. Antworten: 4
    Letzter Beitrag: 07.08.08, 15:19
  5. Antworten: 9
    Letzter Beitrag: 15.01.08, 10:56