Parameter Name herausfinden

  • Themenstarter Themenstarter Flyer
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
F

Flyer

Gast
Hi

ich habe folgenden Code

Code:
Method[] methods = Methods.class.getDeclaredMethods();
for(int i=0;i<methods.length;i++)
{
    System.out.println("\nMethode"+i+": "+methods[i]);
    Method m = methods[i];
    Class[] classes = methods[i].getParameterTypes();
    for(int y=0;y<classes.length;y++)
    {
	System.out.println("Parameter"+i+": "+classes[y]);
    }
}

Dieser liefert mir folgende Ausgabe:
Methode0: public int Test.Methods.getTest()

Methode1: public void Test.Methods.setTest(int,java.lang.String)
Parameter1: int
Parameter1: class java.lang.String

Methode2: public int Test.Methods.getTest1()

Methode3: public void Test.Methods.setTest1(int)
Parameter3: int

Ist es auch möglich anstatt nur den Parameter Typ auch den Namen des übergabe wertes herauszufinden?

also:
getTest(int nummer)

das es mir nummer zurückliefert?

Gruss Flyer
 
Glaube ich kaum, weil wozu brauchst du den übergabe Namen??


Oder willst du den Wert gleich nach dem Methodenaufruf ändern??

Das geht sicher net... weil du sicher zu langsam sein wirst...


Außerdem kann ich mir nur vorstellen, das du damit Hackversuche betreiben willst und die Programm die auf Sicherheit setzen, werden das durch die SecurityPolicy sowieso net zulassen...
 
die frage ist gerecht:

warum brauchst du den Namen ? der ist gelinde gesagt so was von Schnurz für das Programm....
 
ich muss ein Programm machen das die Methoden von Hand getestet werden können. das heisst ich finde heraus welche Methoden es in einer Klasse gibt. danach muss es für jeden Parameter ein TextFeld geben. Und diese muss ich beschriften damit man weiss was man eintragen werden muss! dies wird anhand des parameter namens geholt!

Gruss Flyer
 
Vielleicht kannst du das ja auch mit JavaDoc erledigen.
Du schreibst JavaDoc-Kommentare in deine Klassen und kannst dir damit dann eine Dokumentation generieren lassen, in der man dann nachlesen kann, wie die Klassen aufgebaut sind bzw. wozu die Methoden dienen und mit welchen Parametern sie arbeiten.
Ansonsten fällt mir dann nur noch java.lang.reflect ein.
 
das ist 100% möglich, denn die namen sind in den class files gesüeichert. mit reflection kommst du da aber nicht weiter. schau dir mal die jclasslib an, die kann das
 
Roar hat gesagt.:
das ist 100% möglich, denn die namen sind in den class files gesüeichert. mit reflection kommst du da aber nicht weiter. schau dir mal die jclasslib an, die kann das
was machst du noch so spät auf ? wahrscheinlich dumme Ferien ;-) die jugend heutzutage.....
 
habe es nun mit diesem jclasslib versucht...aber irgendwie habe ich nie die Parameternamen herausgefunden:

Code:
try {
    ClassFile cs = ClassFileReader.readFromFile(new File("C:/eclipse-workspace/Banking/bin/test/Methods.class"));
    MethodInfo[] methods = cs.getMethods();
    for(int i=0;i<methods.length;i++)
    {
        System.out.println("\n"+methods[i].getName());
        AttributeInfo[] attributs = methods[i].getAttributes();
        for(int x=0;x<attributs.length;x++)
        {
            attributs[x].getName();
        }
}
			
} catch (InvalidByteCodeException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

Die Methodenname werden richtig ausgegeben...

wie komme ich zu den Parameteren? stimmt das mit den Attributes?
 
Hallo,

ich bin zwar nicht Flyer habe aber genau die selbe Aufgabenstellung wie er. "ich muss ein Programm machen das die Methoden von Hand getestet werden können. das heisst ich finde heraus welche Methoden es in einer Klasse gibt. danach muss es für jeden Parameter ein TextFeld geben. Und diese muss ich beschriften damit man weiss was man eintragen werden muss! dies wird anhand des parameter namens geholt!"

Wenn es seit früher nicht neue Möglichkeiten in Java gibt die das ermöglichen, ohne irgentwelche zusatzlibs, dann würde mir es auch schon genügen, wenn der Datentyp in den TextFields steht.

Ich bin noch Anfänger. Ist das komplett mit Reflections machbar?
 
Ich Idiot ich gehe einfach in eine Ecke und schäme mich, denn wer lesen kann ist klar im Vorteil (erster Post?!?!?) >.<

Mein Problem: Ich habe einen String und dieser soll zu einer Methode werden. Wie konvertiere ich ein String-Objekt zu einem Method-Objekt?

Method methods = selectedItem;
 
Was machst du denn bei Methoden die ein (kompliziertes) Objekt erwarten? Mit einem Textfeld ist es da ja nicht getan ???:L Oder ist die zu testende Library so "primitiv" dass solch "komplexe" Parameter in Methoden per Definition nicht vorkommen?
 
Normalerweise kommen die wirklich nicht vor, da die Lib hauptsächlich Sachen konvertiert und umrechnet. Wenn doch dann is mir das egal und ich gebe nur die Exceptions aus.

Das Problem von eben habe ich jetzt auch nicht mehr. Doch die Frage ob man irgentwie an die Namen kommt besteht weiterhin. Die namen sind zwar für die JVM schnurz-piepen-deckel-egal, doch wären sie eine nette Zusatzinfo für den Anwender, da die Programmierer sinnvolle Parameternamen wählten, die auf den Zweck schliesen lassen.

Sind die Comments im Bytecode noch enthalten? Dann könnnte man doch vlt /* @param bla auslesen lassen oder? JavaDoc-Valid ist die Lib
 
Musst du viele viele Libs "unterstützen" oder nur eine einzige?

Wäre dann ein einmaliges dekompilieren nicht einfacher?

- Alex
 
Eigentlich nur eine, aber die verändert sich und es ginge zwar für jede Methode dem Prog das per Hand beizubringen, aber wäre es natürlich 'schöner' wenn das automatisiert ablaufen würde. Aber wenn das nicht geht. Schade :?
 
Ich fasse also zusammen:

1) Es geht nur um eine Lib
2) Diese Lib hat "primitive" Methoden, bezogen auf deren Input
3) Die Methoden ändern sich immer mal wieder
4) Du willst ein Programm das die Methoden automatisiert testet (?)

Ich gehe mal davon aus, dass du, wenn sich die Klasse/Lib immer mal wieder ändert, auch an den Source ran kommst. Wäre denn dann ein JUnit Test nicht besser? So in Bezug auf automatisiertes testen.

Für den soll denn das Programm sein? Entwickler? Anwender? "DAU" [1]? Schüler/Studenten für Lernzwecke?
Und für welchen Verwendungszweck soll es genau sein?

Gruß
Alex

[1] http://de.wikipedia.org/wiki/Dümmster_anzunehmender_User
 
1) Es geht nur um eine Lib
-- Korrekt

2) Diese Lib hat "primitive" Methoden, bezogen auf deren Input
-- Korrekt. Ein fiktives Beispiel: booleanInt( boolean trueFalse )
-- Ich gestehe das Beispiel ist etwas 'naja' ^^ Allerdings geht aus dem Namen des Parameters hervor was man zu
übergeben hat.

3) Die Methoden ändern sich immer mal wieder
-- Unter Umständen tuen sie das. Also richtig.

4) Du willst ein Programm das die Methoden automatisiert testet (?)
-- Naja. Dieses Tool ist für Entwickler die keine Ahnung vom entwickeln haben. Wenn diese mittels der Lib ein programm geschrieben haben und es zu fehlern kommt, können sie mit dem Tool ausprobieren ob die Methode vlt nicht das tut was sie soll, oder die einen Fehler gemacht haben. Sprich sie geben Testwerte ein, müssen dafür nicht extra ein neues Java-Programm erstellen und haben schnell auf einem Blick was hinten raus kommt.

Sorry ich hoffe das ist verständlicher
 
Anonymous hat gesagt.:
4) Du willst ein Programm das die Methoden automatisiert testet (?)
-- Naja. Dieses Tool ist für Entwickler die keine Ahnung vom entwickeln haben. Wenn diese mittels der Lib ein programm geschrieben haben und es zu fehlern kommt, können sie mit dem Tool ausprobieren ob die Methode vlt nicht das tut was sie soll, oder die einen Fehler gemacht haben. Sprich sie geben Testwerte ein, müssen dafür nicht extra ein neues Java-Programm erstellen und haben schnell auf einem Blick was hinten raus kommt.

Sorry ich hoffe das ist verständlicher

Ist das eine Pflicht- oder Lernaufgabe für dich? Wenn ja: Entwickel weiter... Lehrer/Profs denken sich lauter so "seltsames", oftmals sinnfreies Zeugs aus.

Wenn nicht, solltest du dir folgendes durch den Kopf gehen lassen:

a) Ein Entwickler der keine Ahnung vom entwickeln hat ist kein Entwickler. Das ist dann ein Anfänger oder Kurpfuscher.
b) Wenn ein seriöser Entwickler eine Lib verwendet, geht man davon aus, dass er eine Lib nimmt die den Status "stable" hat. Soll heißen: Die Lib wurde hinreichend auf Stabilität und korrekte Funktionsweise getestet (meist machen das Lib-Entwickler mit JUnit)
c) Wieviele Entwickler gibt es, die eine Lib verwenden, die ausschließlich so primitive Methoden besitzt, dass sie mit solch einem Testprogramm getestet werden können?
d) Angenommen man findet sehr viele Entwickler die für c) zutreffen: Ist bei so primitiven Methoden der Testvorgang nicht trivial? Ich meine: Wenn ich schon ne primitive Methode habe, ist die dann nicht so primitiv dass da nicht viel dran falsch sein kann?
e) Wenn ein Entwickler eine Lib verwendet, geht er davon aus, dass sie tatsächlich "stable" ist und fängt nicht an Methoden auf ihre Funktion zu testen. Er schreibt ein Testprogramm mit dem er testet ob die Lib für seine Zwecke tauglich ist. Und das wiederum heisst dass er nicht einzelne Methoden jeweils für sich testet, sondern das ganze Sammelsurium in einem ganzen Konstrukt.
 
alex0801 hat gesagt.:
...Wenn ja: Entwickel weiter...

Danke für deine Hilfe ich weiß sie wirklich zu schätzen, aber ich glaube das es tatsächlich nicht sooo unsinnig ist. Die Lib ist eigtl eine API und ermöglicht den Zugriff/die Kommunikation mit einer anderen (in C geschriebenen) groooßen bösen Anwendung.

Klar, ein richtiger entwickler hat sowas nicht nötig, doch bietet mein Programm dann teilweise eine alternative zum dicken API-Handbuch. "Mal eben schnell gucken was die Methode macht". Natürlich und da gebe ich dir recht, ist es nicht das vorbildlichste Vorgehen, welches ein Entwickler an den Tag legen kann, doch es ist eine Alternative und sie ist ge- bzw erwünscht.

Nochmal vielen Dank für deine Hilfe.

Da fällt mir ein anderes Anwendungsbeispiel für eine solche Applikation ein: Ein Super-Mega-Heavy-Duty-Taschenrechner 😀 Man wählt aus einer jList oder Combobox eine der Zich verschiedenen Mathematischen Methoden aus, ein Fenster erscheint mit den Inputs, man gibt was ein und er spuckt was aus. Ist das wirklich so unsinnig? Die Parameternamen wären dann zb neben x,y und z zum Beispiel Exponent, Divident oder Multiplikator.
 
Murray hat gesagt.:
Ist das hier nicht die gleiche Aufgabe?

Tja, ganz klassisch aufgeflogen :roll: Wer nicht wagt der nicht gewinnt? Entschuldigt die entstandene Mühe :? Doch wie ihr seht suche ich nach wie vor das halbe Internet nach einer möglichkeit ab. Ich habe auch schon mit dem Gedanken gespielt die erstellten, fertigen Javadocs via Filestream einzulesen und dann zu zerschnibbeln, aber naja.. Wohl nicht das Beste und eine große Fehlerquelle :bloed:
 
Ganz ehrlich: Ja, das ist Tool ist absoluter Unsinn. Ich beschäftige mich seit 2003 mit Java (also schon ne weile, jedoch noch keine ewigkeit) und ich hätte bis jetzt so ein Tool kein einziges mal gebrauchen können. Grund: So primitive Methoden gibts nicht so oft als das man das überhaupt einsetzen könnte.

Und von wegen dickes API-Handbuch:

Hast du dir mal die Java-API angeschaut? Die API ist nur deshlab so dick weil viele Methoden drin stehen. Aber die wenigsten Methoden haben eine Doku über 10 Zeilen (im Webbrowser).

Und "wildes ausprobieren" ist auch nicht sinn der Sache.

Nur mal angenommen, folgende Methode ließe sich mit deinem Tool "testen" (hab ich willkürlich aus der API rausgepickt):

javax.swing.text.html
Class ImageView
Code:
public int viewToModel(float x,
                       float y,
                       Shape a,
                       Position.Bias[] bias)

Bis ich da "probiert" habe was die Methode macht und wie sie funktiopniert, hab ich doch schneller die Doku "gelesen":

http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/text/html/ImageView.html#viewToModel(float hat gesagt.:
)]
Provides a mapping from the view coordinate space to the logical coordinate space of the model.

Specified by:
viewToModel in class View

Parameters:
x - the X coordinate
y - the Y coordinate
a - the allocated region to render into
Returns:
the location within the model that best represents the given point of view

Die API-Doc ist zudem sehr einfach zu bedienen. Nenn mir irgendeine Methode irgend einer Klasse. Ich such sie dir in nicht ganz 15 sekunden raus (da könnt ich fast noch zwischendrin nen Kaffee holen gehen).

Ein Tool das die API-Doc nochmal aufbereitet ist sogesehen unnötig. Schreib lieber ne Kurzanleitung wie man die API-Doc nutzt. Damit ist den "Entwicklern die nicht entwickeln können" besser beholfen.

- Alex
 
Und was wenn du ganz genau weist ich habe einen Wert 15 und wenn ich diesen Wert der Methode übergebe soll die Zahl 20 wieder rauskommen. Dann macht es doch sinn die Methode mal ganz alleine frei von anderen Konstrukten isoliert zu testen und NICHT extra ein neues Programm zu beginnen. Klar eine Klasse mit einer Main-Anweisung ist schnell geschrieben aber wenn man nur eine Zahl eingeben muss und auf solve klicken muss, ist es noch ein wenig schneller oder nicht?

Warum benutzen Menschen Taschenrechner? Sie könnten auch Schritt für Schritt selbst nachrechnen und wenn sie es nicht können, dann zerstückeln sie die aufgabe in viele kleine Teile bis sie es können. Meinetwegen bis sie die Finger benutzen können. Aber warum tun sies trotzdem nicht? Sie sind faul. Man muss kein Mathematiker sein um 5x5 zu rechnen, aber auch ein Mathematiker könnte es vorziehen solch aufgaben lieber einzutippen als selbst zu denken. Traurig aber wahr. Und das ist das was ich mit diesen Pseudo-Entwicklern meinte.

Man findet sicherlich auf alles Pro- und Kontra-Argumente wenn man nur lange genug sucht.

Danke für die Mühe
 
Nenn mir eine sinnvolle Methode die derart primitiv ist dass ich sie auf diese Weise noch testen muss...

Und ich bin mir sicher: In diesem Fall gibts mehr Kontra wie Pro ...

- Alex
 
Nochmal @Gast

Gast hat gesagt.:
nd was wenn du ganz genau weist ich habe einen Wert 15 und wenn ich diesen Wert der Methode übergebe soll die Zahl 20 wieder rauskommen. Dann macht es doch sinn die Methode mal ganz alleine frei von anderen Konstrukten isoliert zu testen und NICHT extra ein neues Programm zu beginnen.

Ähm, nochmal: Wenn ich

a) weiß was rein muss
und
b) weiß was raus kommen muss, dann schreib ich einen JUnit test mit dem ich alle erdenklichen Extremfälle abdecke. Dann muss ich , wenn sich die API geändert hat, eine neue Version rausgekommen ist oder ich einfach den Test nochmal machen will, nicht "irgend ein Tool" anwerfen und Textfelder mit Zahlen füttern.

Nein, ich nehme meine Lieblings-IDE Eclipse her, öffne den JUnit-Test den ich für die Lib angelegt habe und klicke auf testen.

Ist alles "grün" weiß ich: Alles paletti.
Wird's "rot" weiß ich: Oh je, die Entwickler haben Unsinn getrieben.

Für Blackboxtesting wo ich Eingabe und Ausgabe kenne und nur das innere der Blackbock getestet werden soll nimmt man eben JUnit-Tests.


Und meine Frage steht immer noch:

ich hat gesagt.:
Nenn mir eine sinnvolle Methode die derart primitiv ist dass ich sie auf diese Weise noch testen muss...


- Alex
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben