Avatar billede tanis13 Nybegynder
09. juni 2006 - 13:43 Der er 28 kommentarer og
1 løsning

Signature for alle metoder i en klasse

Hej derude.

Jeg sidder og roder med noget javaprogrammering og vil lave en funktion som kan finde signaturerne for alle metoder i en bestemt klasse, som bliver indlæst fra en tekstfil.

Hvordan kan dette lade sig give?

mvh Tanis
Avatar billede mikkelbm Nybegynder
09. juni 2006 - 13:57 #1
"som bliver indlæst fra en tekstfil"

Hvad mener du helt præcis med det? Hvad er det der bliver læst ind fra en tekstfil?
Avatar billede mikkelbm Nybegynder
09. juni 2006 - 14:03 #2
Men hvis vi snakker almindelig reflection kan du finde metoder i din klasse sådan her:

Class cl = DitObject.class;

Method[] methods = cl.getMethods();
for (Method method : methods)
  System.out.println (method.getName());
Avatar billede mikkelbm Nybegynder
09. juni 2006 - 14:03 #3
Avatar billede tanis13 Nybegynder
09. juni 2006 - 14:04 #4
f.eks skal programmet kunne læse XX.java og finde de metoder - navn, parameter osv, som findes i klassen..
Avatar billede tanis13 Nybegynder
09. juni 2006 - 14:12 #5
Selve problemmet ligger i at jeg har en tekst fil: txt, java eller lign. som jeg skal kunne læse fra.
Programmet skal i denne random fil, som jeg bestemmer, kunne finde metoderne og dets navn, parameter osv.
Avatar billede mikkelbm Nybegynder
09. juni 2006 - 14:13 #6
Men uanset hvad du har af filendelse, så er indeholder den altid en Java Class? Eller hvad?
Avatar billede tanis13 Nybegynder
09. juni 2006 - 14:15 #7
Ja det gør det.
Der er altid en java class.
Avatar billede arne_v Ekspert
09. juni 2006 - 14:25 #8
jeg kan se 3 approaches:

1) du bruger mikkelbm's metode på din class
2) du bruger en java parser på din source fil (ikke helt trivielt)
3) du compiler din source fil og bruger #1
Avatar billede tanis13 Nybegynder
09. juni 2006 - 14:37 #9
Umiddelbart virker mikkelbm's metode svær for mig idet jeg ikke har den store kendskab til de/den metode han bruger i hans eksempel.

Vil det være muligt at uddybe den noget bedre, f.eks. hvis vi siger at vores input fil er bestemt til stien: "c:\javafil.txt" ?
Avatar billede mikkelbm Nybegynder
14. juni 2006 - 08:19 #10
Komplet eksempel:


import java.net.*;
import java.io.*;
import java.lang.reflect.*;

public class Reflection
{
    public static void main (String[] args)
    {
        String fileName = "c:\\java\\blah.java";
        String directory = "c:\\java";
       
        compileFile (fileName);
        Class cls = loadClass (directory);
        if (cls != null)
            listMethods (cls);
    }
   
    private static void listMethods (Class cls)
    {
        Method[] methods = cls.getMethods();
        for (Method method : methods)
            System.out.println (method.getName());
    }
   
    private static void compileFile (String fileName)
    {
        try
        {
            Process process = Runtime.getRuntime().exec ("javac " + fileName);
            process.waitFor();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
   
    private static Class loadClass (String directory)
    {
        File file = new File(directory);
        Class cls = null;
        try
        {
            URL url = file.toURL();
            URL[] urls = new URL[]{url};

            ClassLoader cl = new URLClassLoader(urls);
            cls = cl.loadClass("blah");
        }
        catch (MalformedURLException e)
        {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
       
        return cls;
    }
}
Avatar billede mikkelbm Nybegynder
14. juni 2006 - 08:21 #11
Du får lige en ny - havde glemt at udskfite nogle hardcodet variabler:

import java.net.*;
import java.io.*;
import java.lang.reflect.*;

public class Reflection
{
    public static void main (String[] args)
    {
        String fileName = "c:\\java\\blah.java";
        String directory = "c:\\java";
        String className = "blah";
       
        compileFile (fileName);
        Class cls = loadClass (directory);
        if (cls != null)
            listMethods (cls);
    }
   
    private static void listMethods (Class cls)
    {
        Method[] methods = cls.getMethods();
        for (Method method : methods)
            System.out.println (method.getName());
    }
   
    private static void compileFile (String fileName)
    {
        try
        {
            Process process = Runtime.getRuntime().exec ("javac " + fileName);
            process.waitFor();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
   
    private static Class loadClass (String directory, String className)
    {
        File file = new File(directory);
        Class cls = null;
        try
        {
            URL url = file.toURL();
            URL[] urls = new URL[]{url};

            ClassLoader cl = new URLClassLoader(urls);
            cls = cl.loadClass(className);
        }
        catch (MalformedURLException e)
        {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
       
        return cls;
    }
}
Avatar billede mikkelbm Nybegynder
14. juni 2006 - 08:22 #12
Og så lige:

Class cls = loadClass (directory, className);
Avatar billede tanis13 Nybegynder
14. juni 2006 - 11:44 #13
Når jeg sætter selve koden ind får jeg følgende vejl ved "for (Method method : methods)": 'Syntax error, 'for each' statements are only available if source level is 5.0'.

Kender du noget til denne fejl eller ved hvordan jeg kan komme uden om denne ?
Avatar billede tanis13 Nybegynder
14. juni 2006 - 11:50 #14
lige meget, har fundet ud af det, det skal bare ændres i eclipse til 5.0 i stedet... dog får jeg stadig et par fejl, men ser lige lidt mere på det...
Avatar billede tanis13 Nybegynder
14. juni 2006 - 12:01 #15
Men tusind tak for hjælpen :)
Avatar billede mikkelbm Nybegynder
14. juni 2006 - 12:14 #16
Har du fået det til at køre?
Avatar billede tanis13 Nybegynder
14. juni 2006 - 12:14 #17
når method.getName() bliver kaldt får jeg også disse metodenavne, selvom de ikke findes i programmet, hvorfor?

hashCode
getClass
equals
notify
notifyAll
toString
Avatar billede tanis13 Nybegynder
14. juni 2006 - 12:15 #18
får også en java.io.IOException:
ved .java filen
Avatar billede mikkelbm Nybegynder
14. juni 2006 - 12:26 #19
En IOException kunne tyde på at der er en fejl i din sti.

hashCode
getClass
equals
notify
notifyAll
toString

Er alle metoder der ligger i Objekt, som alle objekter i Java nedarver fra. Derfor får alle subclasses ligeledes disse metoder.
Avatar billede mikkelbm Nybegynder
14. juni 2006 - 12:27 #20
Og det er selvfølgelig Object og ikke Objekt alle klasser nedarver fra :)
Avatar billede tanis13 Nybegynder
14. juni 2006 - 12:57 #21
Ah okay, har fundet en løsning, så nu virker det perfekt :)

tusind tak for hjælpen
Avatar billede tanis13 Nybegynder
14. juni 2006 - 14:46 #22
har lige et spørgsmål til;
Ved method metoden, er det her muligt at få parameterne ud?

F.eks via method.getParameterTypes() ???
'[Ljava.lang.Class;@1f6a7b9' dette skriver den hvis jeg bruger den metode, og det ikke lige det jeg vil have returneret
Avatar billede mikkelbm Nybegynder
14. juni 2006 - 14:52 #23
Husker du at den returnerer et array af Class'es? Det du skriver der ligner nemlig bare en objektreference, som peger på det array.

Class[] parms = method.getParameterTypes();
for (Class cls : parms)
    System.out.println (cls.getName());
Avatar billede tanis13 Nybegynder
14. juni 2006 - 15:39 #24
Hmm, kan ikke lige finde sammen hængen med den kode du lige har pastet og hvordan jeg skal indsætte den i min klasse..
Kan du give en hånd :)
Avatar billede mikkelbm Nybegynder
14. juni 2006 - 20:21 #25
Jeg kan ikke svare på hvor du skal sætte det ind henne. Der hvor du har brug for det! :)

"F.eks via method.getParameterTypes() ???
'[Ljava.lang.Class;@1f6a7b9' dette skriver den hvis jeg bruger den metode, og det ikke lige det jeg vil have returneret"

Skriver den? Hvad er den? Det er svært at hjælpe, når du ikke poster det du har lavet.
Avatar billede tanis13 Nybegynder
14. juni 2006 - 20:37 #26
Jeg har sat
"
Class[] parms = method.getParameterTypes();
for (Class cls : parms)
    System.out.println (cls.getName());
"
ind i din kode længere oppe for at få udskrevet parameterne i metoden.

Her får jeg dog en fejl; "Method cannot be result as a type". Ligeledes siger den at "cls" er dublicated.
Avatar billede mikkelbm Nybegynder
14. juni 2006 - 20:46 #27
Prøv:

private static void listMethods (Class cls)
{
    Method[] methods = cls.getMethods();
    {
        for (Method method : methods)
        {
            System.out.println (method.getName());
            Class[] parms = method.getParameterTypes();
            for (Class parm : parms)
                System.out.println (" Parameter: " + parm.getName());
        }
    }
}
Avatar billede tanis13 Nybegynder
14. juni 2006 - 21:01 #28
Det ser ud til at virke lige nu, men kan ikk garantere jeg støder på flere problemmer :)

Endnu engang tusind tak
Avatar billede tanis13 Nybegynder
14. juni 2006 - 21:03 #29
kan ikke garangtere jeg ikke støder :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester