Reflection Problem

Hallo,

zu meinem Problem: Ich benutze eine API. Es existieren dort mehrere Konstruktor in einer Klasse. Mein Problem jedoch ist, dass ein Konstruktor eben die Annotation @NotNull hat, d.h. ich kann in der Regel diese weglassen (zumindest in der API), das funktioniert auch (ohne Reflection).

So sieht es aus:
http://prntscr.com/bjk6uj

Das Problem an der Sache ist, wenn ich eine neue Instanz ohne Reflections erstelle, dann kann ich den 2. Parameter weglassen. Das ist ja an sich kein Problem.
Aber dasselbe funktioniert leider nicht mit Reflections. Ich habe probiert, den zweiten Parameter "null" zu setzen, jedoch hat dies nicht wirklich etwas gebracht.

An sich verstehe ich die Logik von NotNull überhaupt gar nicht.
Ich habe eine kleine "API" geschrieben:
Code:
public class ReflectionUtil {

    public ReflectionUtil( String name, @NotNull String s ) {
     
    }

    public static class Reflect {

    }
 
}
Dieser Code ist in einer externen Jar und ich verwende es als API. Ich möchte es eben testen. Das Problem jedoch ist, ich habe 2x @NotNull Imports zur Verfügung. Ich habe beim ersten Mal von com.sun.istack.internal.NotNull, beim zweiten Mal com.avaje.ebean.validation.NotNull-

Der 2. Import funktioniert leider nicht, wie ich es will. Der erste Import funktioniert, aber dann habe ich eben folgendes Problem:
http://prntscr.com/bjk9j2

Wie Sie sehen, wurde irgendwie alles vertauscht ("komisch verändert worden"), obwohl ich nur beim zweiten Parameter @NotNull gesetzt habe.

Ich habe versucht, die eigentliche API zu decompilen, habe jedoch keine Annotations gefunden. (IntelliJ Decompiler + JD Gui getestet)

Kann mir einer bitte helfen? Warum ist es vertauscht? Warum funktioniert dort keine Reflection mit einem Parameter (die eigentliche API)?

Danke im Voraus,

LG
 

mrBrown

Super-Moderator
Mitarbeiter
Erstmal müsste man wissen, welche @NotNull dort verwendet wird, die haben alle unterschiedliche Funktionen. Wahrscheinlich ist das nur ein Hinweis für statische CodeAnalyse, hat also nichts mit deinem Problem zu tun - sagt aber aus, das niemals null übergeben werden darf.

@Nullable ist das Gegenstück (eines) @NotNull, deshalb taucht es überall auf, wo nicht (das passende) @NotNull gesetzt ist, du benutz also höchstwahrscheinlich ein falsches - nämlich den für Validation, nicht für CodeAnalyse.

Warum willst du überhaupt Reflection verwenden?
Mit einem Parameter funktioniert es nicht, weil es die Methode mit einem Parameter eben nicht gibt.
 
Danke erstmal für deine Antwort.
Das merkwürdige an der Sache ist eben, dass nur 3 Konstruktoren existieren.
1x ohne Parameter
2x 2 Parameter

Ich kann aber die Instanz mit einem Parameter erstellen, dank dem Annotation.
Beim Decompilen sah ich keine Annotations oder ähnliches, aber beim Aufrufen des Konstruktors wird, wie oben schon beschrieben, @NotNull angezeigt, trotzdem kann ich das einfach weglassen. Ich hatte es auch mit Nullable probiert, bringt trotzdem leider nichts.

Ich habe alle Imports getestet, die es für die beiden gibt.

Der Grund, warum ich das für Reflections schreiben will: Es soll quasi ohne Imports alles laufen. Falls die API geupdated wird, dass ich da später keine Probleme mehr habe.
(Versionsnummer & uvm.)
 

mrBrown

Super-Moderator
Mitarbeiter
Mit welcher IDE arbeitest du? UU sind die automatisch von der IDE ergänzt, und in der API nicht vorhanden.

Ich kann aber die Instanz mit einem Parameter erstellen, dank dem Annotation.
Du rufst also einen Konstruktor auf, der so gar nicht existiert?
Kannst du mal Code zeigen? Sowohl deinen (funktionierenden Aufruf), also auch die aufgerufenen API-Methoden.

Der Grund, warum ich das für Reflections schreiben will: Es soll quasi ohne Imports alles laufen. Falls die API geupdated wird, dass ich da später keine Probleme mehr habe.
(Versionsnummer & uvm.)

Mit Reflection wirst du vermutlich in wesentlich mehr Probleme laufen.
imports etc sollten sich durch Versionsupdates nicht ändern - und wenn sich doch was größeres ändert, funktioniert auch mit Reflection nicht mehr
 
Zuletzt bearbeitet:
Ich benutze IntelliJ.

Du rufst also einen Konstruktor auf, der so gar nicht existiert?
Kannst du mal Code zeigen? Sowohl deinen (funktionierenden Aufruf), also auch die aufgerufenen API-Methoden.

Code:
    public DataGetter() {

    }

    public DataGetter(xxx var1, xxx var2) {
        this.d = var1;
        xxx[] var3 = var2;
    }

    public DataGetter( xxx var1, Iterable<xx> var2) {
        this.e = var1;
        Iterator var3 = var2.iterator();


    }
Ich musste paar Sachen zensieren, die sind aber nicht wirklich relevant.
Aufrufen tue ich einfach mit new DataGetter( var1 ); das war's auch schon.
Der Code wird aktuell nichts bringen, da es eine große API ist und allein keinen Nutzen hat.

Mit Reflection wirst du vermutlich in wesentlich mehr Probleme laufen.
imports etc sollten sich durch Versionsupdates nicht ändern - und wenn sich doch was größeres ändert, funktioniert auch mit Reflection nicht mehr
Leider schon. Die Packages ändern sich (Versionsnummer). Ich kann aber die benutzte Versionsnummer aufrufen (wenn das Programm gestartet ist), deswegen ist Reflection quasi Pflicht.
Es ist etwas kompliziert zu verstehen.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich musste paar Sachen zensieren, die sind aber nicht wirklich relevant.
Aufrufen tue ich einfach mit new DataGetter( var1 ); das war's auch schon.
Der Code wird aktuell nichts bringen, da es eine große API ist und allein keinen Nutzen hat.
Ohne Verwendung andere externer libs wird das so in keinem Fall kompilieren^^

Leider schon. Die Packages ändern sich (Versionsnummer). Ich kann aber die benutzte Versionsnummer aufrufen (wenn das Programm gestartet ist), deswegen ist Reflection quasi Pflicht.
Es ist etwas kompliziert zu verstehen.
Eigentlich ziemlich leicht zu verstehen...Wenn die Versionsnummer im Package steht, ist die API halt schlecht programmiert. Wenn die neue API-Version kompatibel zur alten ist, sollte man die nicht einfach künstlich inkompatible machen. Und wenn sie wirklich inkompatible ist, dann müsste man es auch bei Reflection anpassen.
 
Welchen von den beiden Konstruktoren möchtest du jetzt aufrufen?
Das Problem ist, keins von den. Wie im Screenshot (prntscr) oben zusehen ist, werden bei mir in den Parametern @NotNull angezeigt (beim 2.). Ich kann aber trotzdem eine neue Instanz mit einem Parameter erstellen.

Ohne Verwendung andere externer libs wird das so in keinem Fall kompilieren^^


Eigentlich ziemlich leicht zu verstehen...Wenn die Versionsnummer im Package steht, ist die API halt schlecht programmiert. Wenn die neue API-Version kompatibel zur alten ist, sollte man die nicht einfach künstlich inkompatible machen. Und wenn sie wirklich inkompatible ist, dann müsste man es auch bei Reflection anpassen.
Ich passe es auch in dem Reflection alles an.
Ich finde es auch schlecht, dass die Versionsnummer in dem Package drin steht, aber man kann dagegen wohl nichts machen.
 

mrBrown

Super-Moderator
Mitarbeiter
Das Problem ist, keins von den. Wie im Screenshot (prntscr) oben zusehen ist, werden bei mir in den Parametern @NotNull angezeigt (beim 2.). Ich kann aber trotzdem eine neue Instanz mit einem Parameter erstellen.

Nein, zumindest mit den hier geposteten Konstruktoren kannst du das nicht. @NotNull/@Nullable ändern daran nichts, die haben damit nichts zu tun.

Ich passe es auch in dem Reflection alles an.
Ich finde es auch schlecht, dass die Versionsnummer in dem Package drin steht, aber man kann dagegen wohl nichts machen.
Was spricht denn dann noch für Reflection, wenn du es ehh anpassen musst (vs. anpassen der Imports, was die IDE automatisch macht)? ;)
Offensichtlich klappt es ja grad mit Reflection ehh nicht, auf normalem Weg aber schon...
 

mrBrown

Super-Moderator
Mitarbeiter
Die Annotation com.avaje.ebean.validation.NotNull kann nicht als Parameter-annotation benutzt werden, zumindest wenn das der Code dafuer ist:
https://github.com/mochalov/avaje-e.../java/com/avaje/ebean/validation/NotNull.java

Das Target muesste den ElementType.PARAMETER haben damit das geht, sonst ist die einfach nicht sichtbar. Eigentlich muesste deine IDE sich darueber beschweren.
Wie gesagt, es gibt verschiedene @NonNull - zb org.jetbrains.annotations.NotNull, welche dazu dient, ua bei Parametern anzugeben, das diese nicht Null sein dürfen (allerdings nur für statische Codeanalyse relevant, nicht zur Laufzeit).
 

mrBrown

Super-Moderator
Mitarbeiter
Wird schon nen Grund haben, warum's da nen zweiten Parameter gibt, und und keinen Konstruktor mit einem ;)

Wenn dir der aber egal ist, Kapsel das einfach hinter ner eigenen Methode ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
brunothg Problem mit Reflection Allgemeine Java-Themen 6
R Reflection Problem Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
Y Reflection - wie anwenden/benutzen bei folgendem Problem Allgemeine Java-Themen 3
C Reflection Problem! Allgemeine Java-Themen 2
V Reflection - Problem Allgemeine Java-Themen 3
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
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
B Reflection: getMethods schlägt fehl (NoClassDefFoundE)) Allgemeine Java-Themen 15
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
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
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
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
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
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
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

Neue Themen


Oben