Reflection: getMethods schlägt fehl (NoClassDefFoundE))

bdorninger

Mitglied
Annahme: Wir haben eine Klasse "MyClassToCheck" (siehe code Snippet unten)

Von einer Anwendung aus möchte ich prüfen, od diese Klasse Methoden bietet, die einer bestimmten Signatur folgen. Dabei kann ich aber die Verfügbarkeit aller im Code dieser Klasse verwendeten Typen nicht voraussetzen. (symbolisiert durch unten verwendete "ClassNotOnClasspath")
In dieser Anwendung hol ich mir die zu überprüfende Klasse mit "Class.forName" und ruf dann getMethods() auf.

....
cl = Class.forName("checkit.MyClassToCheck");
Method[] meth=cl.getMethods();
....

Klarerweise darf die Klasse keinen static member von "ClassNotOnClasspath" haben.
Aber warum endet der call mit einem NCDFE, wenn eine Var dieses Typs innerhalb eines try-catch Blocks deklariert wird? ???:L
Kann jemand von Euch Gurus für Aufklärung sorgen ?

Thx,
Bernhard

---------------------------------------------------
Java:
package checkit;

import refl.ReflTest2.AnotherParamOnClassPath;
import refl.ReflTest2.ParamOnClassPath;
import refl.ReflTest2.RetValOnClassPath;
import tocheck.ClassNotOnClassPath;

class MyClassToCheck
{
    ClassNotOnClassPath instance_member1=new ClassNotOnClassPath();;  // --> WORKS !!
    //static ClassNotOnClassPath static_member1=new ClassNotOnClassPath();  // --> DOES NOT WORK which is comprehensible!!


    public RetValOnClassPath myMethodName( ParamOnClassPath par1, AnotherParamOnClassPath par2)
    {
        ClassNotOnClassPath local=new ClassNotOnClassPath();  // --> WORKS !!
        
        if(System.getProperty("aProperty")!=null)
        {
            ClassNotOnClassPath blocklocal=new ClassNotOnClassPath();  // --> WORKS !!
            System.out.println(blocklocal);
        }
        
        try {
            //ClassNotOnClassPath trylocal=new ClassNotOnClassPath();  // DOES NOT WORK  !!!
            RetValOnClassPath rv=new RetValOnClassPath();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
        return new RetValOnClassPath();
    }
}
 
M

maki

Gast
static Attribute werden vom ClassLoader initialisiert, zu diesem Zeitpunkt ist die ClassNotOnClassPath noch gar nicht manuell geladen worden, ist ja schliesslich nicht im Classpath ;)
 

bdorninger

Mitglied
static Attribute werden vom ClassLoader initialisiert, zu diesem Zeitpunkt ist die ClassNotOnClassPath noch gar nicht manuell geladen worden, ist ja schliesslich nicht im Classpath ;)

Naja, DAS ist mir klar - das steht auch in meiner Anfrage und im Src code comment ist das auch nochmal erwähnt.
Was NICHT klar ist, warum eine lokale Decl im try-catch Block Probleme verrusacht. Dahin ging auch meine Frage
 

mvitz

Top Contributor
Bei mir macht das keine Probleme.

Java:
package de.mvitz.example.java.reflection.incomplete_cp;

public final class NotOnClassPath {
}

Java:
package de.mvitz.example.java.reflection.incomplete_cp;

public final class OnClassPath {

    public String myMethod() {
        try {
            new NotOnClassPath();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "Foo";
    }

}

Java:
package de.mvitz.example.java.reflection.incomplete_cp;

import java.util.Arrays;

public final class Main {

    public static void main(String[] args) throws Exception {
        Class<?> clazz = Class.forName("de.mvitz.example.java.reflection.incomplete_cp.OnClassPath");
        System.out.println(Arrays.asList(clazz.getMethods()));
    }

}
 

bdorninger

Mitglied
Du hast in Deinem code aber keine Deklaration.
ein new ohne Zuweisung ist etwas sinnlos.

Relativieren muss ich allerdings: Bereits class.forName auf die eigentlich existierende MyClassToCheck schlägt mit einem NCDFE fehl und nicht erst getMethods().
Grund für meine etwas irreführende Aussage ist, dass der ursprüngliche Code in einer OSGi Umgebung läuft. In der verwende ich einen speziellen Classloader, der die zu prüfende Klasse (korrekt oder auch nicht) erkennt und ein Class Object bereitstellt. Dort schlägt aber dann eben getMethods fehl.

Doch das Grundproblem bleibt das selbe.
Ich müh mich grad ein wenig durch die VM spec, aber bin bisher nicht schlauer geworden.

Thanx aber vorerst mal für Eure Bemühungen. Weitere Erkenntnisse werden natürlich gerne entgegengenommen ;)

Bei mir macht das keine Probleme.
 
Zuletzt bearbeitet:

mvitz

Top Contributor
Natürlich macht new ohne Zuweisung Sinn, wenn das Object z.B. etwas mit Seiteneffekten macht, ohne das man die Instanz braucht. Ist aber für diesen Fall völlig egal:

Java:
package de.mvitz.example.java.reflection.incomplete_cp;

public final class NotOnClassPath {
    public void doSomething() { System.out.println("NotOnClassPath.doSomething"); }
}

Java:
package de.mvitz.example.java.reflection.incomplete_cp;

public final class OnClassPath {

    public String myMethod() {
        try {
            final NotOnClassPath object = new NotOnClassPath();
            object.doSomething();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "Foo";
    }

}

Main wie vorher --> funktioniert weiterhin ohne Probleme.

[EDIT]Vermutlich liegt das Problem dann eher an einer deiner anderen Änderungen.
Hättest ruhig direkt erwähnen können, dass du dich a) in einer OSGI Umgebung bewegst und b) sogar einen eigenen ClassLoader verwendest.[/EDIT]
 

bdorninger

Mitglied
Natürlich macht new ohne Zuweisung Sinn, wenn das Object z.B. etwas mit Seiteneffekten macht, ohne das man die Instanz braucht. Ist aber für diesen Fall völlig egal:
Ja, dann schon. Würde ich persönlich aber als bad style bezeichnen - für sowas gäb es nämlich static Methoden

..funktioniert weiter....

Vermutlich liegt das Problem dann eher an einer deiner anderen Änderungen.
Hättest ruhig direkt erwähnen können, dass du dich a) in einer OSGI Umgebung bewegst und b) sogar einen eigenen ClassLoader verwendest.

Der letzte gepostete Code von Dir funktioniert bei mir unter J6/27 und J7/1 nicht. Der ohne Decl schon.
Wie führst du das Beispiel bei Dir aus?

Bezüglich "anderer Änderungen":
Das ist nicht der Fall, da sich mein Beispiel wie gesagt auch ausserhalb eines OSGi Container nachvollziehen lässt - siehe meinen geposteten Code.
Zusätzlich habe ich ein ausführbares Jar inkl. Sourcen drangehängt - falls es Dich interessiert.

lg,
Bernhard
 

mvitz

Top Contributor
JDK 1.6.0_30 als Maven Projekt.
Ausführung sowohl über die Kommandozeile, als auch über Eclipse.

Auch per
Code:
javac -version
#javac 1.7.0

java -version
#java version "1.7.0"
#Java(TM) SE Runtime Environment (build 1.7.0-b147)
#Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)

keine Probleme.
 

bdorninger

Mitglied
Hmm. eigenartig. Kannst Du mir ein executable Jar zukommen lassen?
Über Eclipse funktionierts bei mir auch - was ja klar ist da man ja zum kompilieren die NotOnCP Klassen braucht und Eclipse dann ja die auch den Build CP in den Run CP übernimmt.

Thx,
Bernhard

JDK 1.6.0_30 als Maven Projekt.
Ausführung sowohl über die Kommandozeile, als auch über Eclipse.

Auch per
Code:
javac -version
#javac 1.7.0

java -version
#java version "1.7.0"
#Java(TM) SE Runtime Environment (build 1.7.0-b147)
#Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)

keine Probleme.
 

mvitz

Top Contributor
In diesem Falle ist das bei Eclipse nicht der Fall, da ich 3 Projekte habe und Main nur auf OnCp verweist, nicht aber auf NotOnCp. OnCp verweist zwar auf NotOnCp, exportiert dieses aber nicht.

Anbei die 3 Binaries (müssten die mit 1.7 kompilierten sein).
 

Anhänge

  • not-on-cp-1.0.0-SNAPSHOT.jar
    3 KB · Aufrufe: 1
  • main-1.0.0-SNAPSHOT.jar
    3,2 KB · Aufrufe: 2

bdorninger

Mitglied
In diesem Falle ist das bei Eclipse nicht der Fall, da ich 3 Projekte habe und Main nur auf OnCp verweist, nicht aber auf NotOnCp. OnCp verweist zwar auf NotOnCp, exportiert dieses aber nicht.

Anbei die 3 Binaries (müssten die mit 1.7 kompilierten sein).

Besten Dank. Nun kommen wir der Antwort etwas näher.
Mit J6 und J7 (auf J6/7 source/class compliance) compiliert funktioniert Dein und auch mein Beispiel.
Der Build des Projekts erfolgt aber nach Rücksprache beim Kunden mit Java 5 compiler compliance-die haben noch nicht flächendeckend auf 6 umgestellt.

Dann scheint das wohl in früheren Versionen des Compilers ein Bug zu sein.....

Das Problem ist damit noch nicht ganz gelöst, aber da muss man halt dann am Deployment Szenario drehen.
 
Zuletzt bearbeitet:

mvitz

Top Contributor
Stimmt,

kompiliert mit 1.6 auf 1.5 Kompatibilität und ausgeführt mit 1.6 --> NCDFE
kompiliert mit 1.5 auf 1.5 Kompatibilität und ausgeführt mit 1.5 --> NCDFE
 

bdorninger

Mitglied
Stimmt,

kompiliert mit 1.6 auf 1.5 Kompatibilität und ausgeführt mit 1.6 --> NCDFE
kompiliert mit 1.5 auf 1.5 Kompatibilität und ausgeführt mit 1.5 --> NCDFE

wie gesagt - Gesamtproblem nicht zu 100% gelöst, aber unsere Diskussion hat Licht in die Sache gebracht - deswegen nochmal Danke

Übrigens im selben Zeitraum auf die gleiche Frage in den Oracle Java foren NULL Resonanz...
 

bdorninger

Mitglied
Wäre theoretisch möglich. Aber mvitz hat das ja schon beantwortet, deshalb spare ich mir den Versuch. Nachdem es sich so deutlich am Compliance Level zeigt und nicht am Compiler-release vermute ich da aber eher den "Fehler" im Bytecode.

lg,
Bernhard
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Reflection gone wrong? Allgemeine Java-Themen 21
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Reflection - Abprüfen von Klasseneigenschaften Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
J Reflection-Method Hook? Allgemeine Java-Themen 14
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
A Reflection Problem Allgemeine Java-Themen 15
K Generic class und Reflection Allgemeine Java-Themen 2
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
E Reflection? Frage Allgemeine Java-Themen 4
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
T Reflection Allgemeine Java-Themen 11
G Klassen Cast auf Argumentenklasse via Reflection? Allgemeine Java-Themen 10
H Collections Generics und Reflection Allgemeine Java-Themen 6
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
P Reflection "Cast" Allgemeine Java-Themen 5
D Reflection-Performance Allgemeine Java-Themen 7
S Reflection und Generic Allgemeine Java-Themen 9
W Reflection -> getMethod bei optionalen Parametern Allgemeine Java-Themen 4
Kr0e Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor Allgemeine Java-Themen 15
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Probleme mit Reflection Allgemeine Java-Themen 10
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
G Java Reflection Allgemeine Java-Themen 11
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
brunothg Problem mit Reflection Allgemeine Java-Themen 6
M reflection in inner classes Allgemeine Java-Themen 7
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
Y Reflection und "extends" Schlüsselwort Allgemeine Java-Themen 3
R Reflection Problem Allgemeine Java-Themen 4
N getName() of reflection Object Allgemeine Java-Themen 4
P Reflection - Wie rufe ich die Felder einer Klasse in einer Methode der Basisklasse? Allgemeine Java-Themen 4
M Reflection Queue auslesen Allgemeine Java-Themen 6
N generic reflection Allgemeine Java-Themen 5
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
MQue Reflection Exception Allgemeine Java-Themen 11
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
ruutaiokwu Per Reflection membervariablen überschreiben / zuweisen / nullen Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
R Reflection: Membervariablen-Initialwerte Allgemeine Java-Themen 4
G Reflection Allgemeine Java-Themen 6
V reflection in java 5 und 6 Allgemeine Java-Themen 2
C Reflection Übergabeparamter überprüfen? Allgemeine Java-Themen 3
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
G [Reflection + WebService] Methodenaufruf an einem Proxy Allgemeine Java-Themen 11
T Parameternamen mit Reflection-API Allgemeine Java-Themen 14
M reflection mit parametern Allgemeine Java-Themen 8
M Reflection Frage Allgemeine Java-Themen 7
G Code vereinfachen bei Reflection Allgemeine Java-Themen 4
I reflection get inner static classes Allgemeine Java-Themen 2
C Reflection Allgemeine Java-Themen 12
Y Reflection - wie kann ich eine Methode benutzen Allgemeine Java-Themen 4
Y Reflection - wie anwenden/benutzen bei folgendem Problem Allgemeine Java-Themen 3
P Java Reflection API - ResultDataModel ? Allgemeine Java-Themen 3
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
G Reflection: aktuelle bzw umschliessende Methode? Allgemeine Java-Themen 7
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
C Reflection Problem! Allgemeine Java-Themen 2
G Object cast via Reflection Allgemeine Java-Themen 8
T Reflection und Typsicherheit Allgemeine Java-Themen 5
Q Umgang mit Reflection Allgemeine Java-Themen 4
S reflection Allgemeine Java-Themen 12
X Reflection performant? Allgemeine Java-Themen 11
M Reflection und Serializable Allgemeine Java-Themen 5
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
the[V]oid Primitive Arrays per Reflection erzeugen? Allgemeine Java-Themen 2
W Package via Reflection parsen Allgemeine Java-Themen 4
R Interface mittels Reflection implementieren Allgemeine Java-Themen 8
M reflection Integer != int ? Allgemeine Java-Themen 3
M reflection invoce Allgemeine Java-Themen 3
K Reflection:Zugriff auf innere Klassen Allgemeine Java-Themen 4
N NoSuchMethodException bei Reflection-Versuch, aber warum? Allgemeine Java-Themen 3
byte Methodenaufruf per Reflection? Allgemeine Java-Themen 2
M Generics und Reflection Allgemeine Java-Themen 3
M Array per Reflection manipulieren Allgemeine Java-Themen 5
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
thE_29 Reflection Allgemeine Java-Themen 6
M statische Methode per reflection aufrufen Allgemeine Java-Themen 2
B Frage zu Reflection Allgemeine Java-Themen 3
V Reflection - Problem Allgemeine Java-Themen 3
clemson Reflection Interface Allgemeine Java-Themen 4
G mit reflection an die felder einer klasse rankommen Allgemeine Java-Themen 4
N Reflection: An Package einer .class-Datei kommen Allgemeine Java-Themen 2
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
B Reflection Allgemeine Java-Themen 10
C Reflection und variable casten ! Allgemeine Java-Themen 10
C Reflection - Kurze Beschreibung? Allgemeine Java-Themen 3
F Frage zum Thema Reflection Allgemeine Java-Themen 13

Ähnliche Java Themen


Oben