Klassenattributen und -Methoden kopieren

Ich muss viele Daten aus einer java klasse kopieren. Ich kann alle statische Variablen kopieren (siehe keine Beispiel) aber ich weiss nicht wie ich die statische Methoden (also Methodenkopf plus Deklaration) kopiere. Weiss jemand Abhilfe?


Code:
class Klasse1 {


public static int zahl=3;


public static String aa="ab";


public static double summe(double x, double y){
return (x+y);
}

}


Code:
import java.io.*;
import java.util.*;


public class Kopieren {
public static void main(String[] args) {
try {
File ZielDatei = new File("Klasse2.java");
FileWriter ausgabe = new FileWriter(ZielDatei);
PrintWriter neuSetzen = new PrintWriter(ausgabe);

neuSetzen.printf(Locale.ENGLISH, "class Klasse2 {\n");
neuSetzen.printf(Locale.ENGLISH, "\n");
neuSetzen.printf(Locale.ENGLISH, "public static int zahl=%d;\n", Klasse1.zahl);
neuSetzen.printf(Locale.ENGLISH, "\n");
neuSetzen.printf(Locale.ENGLISH, "public static String aa=\"%s\";\n", Klasse1.aa);
neuSetzen.printf(Locale.ENGLISH, "\n");


neuSetzen.printf(Locale.ENGLISH, "\n");
neuSetzen.printf(Locale.ENGLISH, "\n");
neuSetzen.printf(Locale.ENGLISH, "}\n");
neuSetzen.printf(Locale.ENGLISH, "\n");
neuSetzen.close();
} catch(IOException ioe) {
System.out.println("Falsche Datei");
}
}
}


Als Ergebnis bekomme Klasse2.java aber ohne die statische Methode public static double summe(double x, double y)



Code:
class Klasse2 {

public static int zahl=3;

public static String aa="ab";



}
 

hendl

Erfahrenes Mitglied
Hi
Die Methodennamen und Parameter kannst du so auslesen aber für den Methodencode habe ich gerade keine Idee wie man das machen könnte.
Java:
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.util.Locale;

public class Kopieren {

   public static void main(String[] args) {
     // File ZielDatei = new File("Klasse2.java");
     // FileWriter ausgabe = new FileWriter(ZielDatei);
     PrintWriter neuSetzen = new PrintWriter(System.out);

     neuSetzen.printf(Locale.ENGLISH, "class Klasse2 {\n");
     neuSetzen.printf(Locale.ENGLISH, "\n");
     neuSetzen.printf(Locale.ENGLISH, "public static int zahl=%d;\n",
         Klasse1.zahl);
     neuSetzen.printf(Locale.ENGLISH, "\n");
     neuSetzen.printf(Locale.ENGLISH, "public static String aa=\"%s\";\n",
         Klasse1.aa);
     neuSetzen.printf(Locale.ENGLISH, "\n");

     // Methoden auslesen
     Method methods[] = Klasse1.class.getDeclaredMethods();
     for (Method m : methods) {
       neuSetzen.printf(
           Locale.ENGLISH,
           Modifier.toString(m.getModifiers()) + " "
               + m.getReturnType() + " " + m.getName() + "(");

       // Parameter auslesen
       Parameter paras[] = m.getParameters();
       for (int i = 0; i < paras.length; i++) {
         neuSetzen.printf(
             Locale.ENGLISH,
             paras[i].getParameterizedType() + " "
                 + paras[i].getName()
                 + (i < paras.length - 1 ? "," : ""));
       }

       neuSetzen.printf(Locale.ENGLISH, ")");

       // Exceptions auslesen
       Class<?>[] exceptions = m.getExceptionTypes();
       if (exceptions.length > 0) {
         neuSetzen.printf(Locale.ENGLISH, " throws ");
         for (int k = 0; k < exceptions.length; k++) {
           neuSetzen.printf(Locale.ENGLISH, exceptions[k].getName()
               + (k < exceptions.length - 1 ? "," : ""));

         }
       }
       neuSetzen.printf(Locale.ENGLISH, "{\n");
       // Methodencode
       neuSetzen.printf(Locale.ENGLISH, "\n}");
     }
     neuSetzen.printf(Locale.ENGLISH, "\n");
     neuSetzen.printf(Locale.ENGLISH, "}\n");
     neuSetzen.printf(Locale.ENGLISH, "\n");
     neuSetzen.close();
   }
}
Lg hendl
 

hendl

Erfahrenes Mitglied
Hi
Eine Möglichkeit wäre die erste Klasse als File auszulesen und direkt wieder zu speichern, falls das erwünscht ist :D

Da ich ein wenig Zeit hatte habe ich es mal versucht :):)

Java:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.util.Locale;

public class Kopieren {

    public Kopieren(Mode workingMode) throws Exception {
        // File ZielDatei = new File("Klasse2.java");
        // FileWriter ausgabe = new FileWriter(ZielDatei);
        PrintWriter neuSetzen = new PrintWriter(System.out);
        if (workingMode.equals(Mode.Dynamic)) {
            neuSetzen.printf(Locale.ENGLISH,
                    Modifier.toString(Klasse1.class.getModifiers())
                            + (Modifier.toString(Klasse1.class.getModifiers())
                                    .equals("") ? "" : " ") + "class "
                            + Klasse1.class.getSimpleName() + "{\n");
            neuSetzen.printf(Locale.ENGLISH, "\n");
            Field vars[] = Klasse1.class.getDeclaredFields();
            for (Field v : vars) {
                neuSetzen.printf(
                        Locale.ENGLISH,
                        Modifier.toString(v.getModifiers()) + " "
                                + v.getGenericType().getTypeName() + " "
                                + v.getName() + "=" + v.get(Klasse1.class)
                                + ";\n");
            }
            neuSetzen.printf(Locale.ENGLISH, "\n");

            // Methoden auslesen
            Method methods[] = Klasse1.class.getDeclaredMethods();
            for (Method m : methods) {
                neuSetzen.printf(
                        Locale.ENGLISH,
                        Modifier.toString(m.getModifiers()) + " "
                                + m.getReturnType() + " " + m.getName() + "(");

                // Parameter auslesen
                Parameter paras[] = m.getParameters();
                for (int i = 0; i < paras.length; i++) {
                    neuSetzen.printf(
                            Locale.ENGLISH,
                            paras[i].getParameterizedType() + " "
                                    + paras[i].getName()
                                    + (i < paras.length - 1 ? "," : ""));
                }

                neuSetzen.printf(Locale.ENGLISH, ")");

                // Exceptions auslesen
                Class<?>[] exceptions = m.getExceptionTypes();
                if (exceptions.length > 0) {
                    neuSetzen.printf(Locale.ENGLISH, " throws ");
                    for (int k = 0; k < exceptions.length; k++) {
                        neuSetzen
                                .printf(Locale.ENGLISH,
                                        exceptions[k].getName()
                                                + (k < exceptions.length - 1 ? ","
                                                        : ""));

                    }
                }
                neuSetzen.printf(Locale.ENGLISH, "{\n");
                // Methodencode
                neuSetzen.printf(Locale.ENGLISH, "\n}");
            }
            neuSetzen.printf(Locale.ENGLISH, "\n");
            neuSetzen.printf(Locale.ENGLISH, "}\n");
            neuSetzen.printf(Locale.ENGLISH, "\n");

        } else {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    new FileInputStream(("src/<package>/Klasse1.java"))));
            String tmp;
            while ((tmp = br.readLine()) != null) {
                neuSetzen.printf(Locale.ENGLISH, tmp + "\n");
            }
            br.close();
        }
        neuSetzen.close();
    }

    public static void main(String[] args) {
        try {
            new Kopieren(Mode.Read);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

enum Mode {
    Read, Dynamic;
}
Lg hendl
 
Zuletzt bearbeitet: