反思问题

时间:2015-04-06 12:24:04

标签: java

/*
    throws me the next Exception 
    line 66 and 179 java.lang.newInstanceationException:Angajat at java.lang.class.newInstance(unknown source)
    at mySerializer.deserializare.Object(mySerializer_final).java:66
    at Main1.main(myserializer_final).java.179
    caused by java.lang.NoSuchMethodException:Angajat.(init)
    at java.lang.class.getConstructor0(unknown source)
    */

    import java.io.*;
    import java.util.*;
    import java.lang.reflect.*;
    class Angajat {
        public String nume;
        public int salariu;
        private int varsta;
        public Angajat(String nume, int salariu, int varsta)
        {
        this.nume=nume;
        this.salariu=salariu;
        this.varsta=varsta;
        }

        public String toString(){
        return this.nume+ " (" + this.salariu + ")";
        }
    }
    class MySerializer{
        public void serializareObiect(BufferedWriter buffer_out, Object object){
        try{
            Class c=object.getClass();
            buffer_out.write(c.getName()+"\n");
            //  preluarea si adaugarea intr-o listFields a field-urilor dintr-o anumita clasa

            ArrayList<Field> listFields = new ArrayList<Field>();
            Field[] field = c.getDeclaredFields();  //campuri declarate
            for (Field f1 : field) 
                {
                  f1.setAccessible(true);
                listFields.add(f1);
                }

            Field[] inherited_field = c.getFields(); //campuri publice/mostenite
                for (Field f2 : inherited_field) 
                {
                 f2.setAccessible(true);
                 listFields.add(f2);
                }


                //scrierea in fisier a campurilor unui obiect
             for (int i = 0; i < listFields.size(); i++) {

                Field writeField = listFields.get(i);

                if (writeField.get(object) != null)
                    buffer_out.write(writeField.get(object) + "\n");
                else if (writeField.get(object) == null)
                    buffer_out.write("null \n");
            }

            buffer_out.flush();
         }
         catch(Exception e){
         System.out.println("error");
         }

        }

        public Object deserializareObject(BufferedReader buffer_in) throws Exception{

            String name_of_class = buffer_in.readLine();

            Class  c = Class.forName(name_of_class);
            Object serialize_object = c.newInstance();

        //  preluarea si adaugarea intr-o listFields a field-urilor dintr-o anumita clasa

          List<Field> listFields = new ArrayList<Field>();

            Field[] field = c.getDeclaredFields(); //campuri declarate
            for (Field f1 : field) 
                {
                    f1.setAccessible(true);
                    listFields.add(f1);
                }


            Field[] inherited_field = c.getFields(); //campuri mostenite/publice
            for (Field f2 : inherited_field) 
                {
                  f2.setAccessible(true);
                    listFields.add(f2);
                }


            for (int i = 0; i < listFields.size(); i++)
                {
                    String class_name = listFields.get(i).getType().getName().toString();
                    String read_field = buffer_in.readLine();
                Field f;
                    class_name = conversieTipuri(class_name);
                     if (read_field.equals("null") == false) {
                if (class_name.equals("java.lang.Integer")){
                    f=listFields.get(i); //obtinem valoarea campului
                    f.set(serialize_object, Integer.parseInt(read_field)); //o setam la acea valoare!!(pentru a reface sirul de biti)
                    }
                else if (class_name.equals("java.lang.Long")){
                    f=listFields.get(i);
                    f.set(serialize_object, Long.parseLong(read_field));
                }
                else if (class_name.equals("java.lang.Short")){
                  f=listFields.get(i);
                    f.set(serialize_object, Short.parseShort(read_field));
                }
                else if (class_name.equals("java.lang.Character")){
                    f=listFields.get(i);
                    f.set(serialize_object, read_field.charAt(0));
                }
                else if (class_name.equals("java.lang.Float")){
                    f=listFields.get(i);
                    f.set(serialize_object, Float.parseFloat(read_field));
                }
                else if (class_name.equals("java.lang.Double")){
                    f=listFields.get(i);
                    f.set(serialize_object,Double.parseDouble(read_field));
                }else if (class_name.equals("java.lang.Boolean")){
                    f=listFields.get(i);
                    f.set(serialize_object,Boolean.parseBoolean(read_field));
                }
                else if (class_name.equals("java.lang.String")){
                    f=listFields.get(i);
                    f.set(serialize_object, read_field);
                }
                else if (class_name.equals("java.lang.Byte")){
                    f=listFields.get(i);
                    f.set(serialize_object, read_field);
                }
            } else
                listFields.get(i).set(serialize_object, null);

                }
                return serialize_object;
        }

        public String conversieTipuri(String class_name) {

            String name="";
            switch(class_name){
                case "int" :    name="java.lang.Integer";
                break;
                case "double":  name="java.lang.Double";
                break;
                case "float":   name="java.lang.Float";
                break;
                case "boolean": name="java.lang.Boolean";
                break;
                case "char":    name="java.lang.Character";
                break;
                case "byte":    name="java.lang.Byte";
                break;
                case "long":    name="java.lang.Long";
                break;
                case "short":   name="java.lang.Short";
                break;
                default:        name=class_name;
                break;
                }
                return name;
          }
    }
    class Main1{
        public static void main(String args[]){
        try{
        Angajat ang=new Angajat("Adi Vaduva", 20000, 21);
        FileWriter f=new FileWriter("angajati1.ser");
        BufferedWriter fos=new BufferedWriter(f);
        //  BufferedWriter fos=new BufferedWriter(new FileWriter("angajati1.ser"));
        //  ObjectOutputStream out=new ObjectOutputStream(fos);
        //out.writeObject(ang);
        MySerializer ms=new MySerializer();
        ms.serializareObiect(fos, ang);
        //  BufferedReader fis=new BufferedReader(new FileReader("angajati1.ser"));
        //ObjectInputStream in=new ObjectInputStream(fis);
        f.close();
        FileReader f1=new FileReader("angajati1.ser");
        BufferedReader fis=new BufferedReader(f1);
        ms.deserializareObject(fis);
        f1.close();
        }catch(IOException e){
            System.out.println("eroare!");
        }

           catch(NoSuchMethodException e){
            e.printStackTrace();    }
        catch(Exception e){
        e.printStackTrace();
        }
        }
    }

1 个答案:

答案 0 :(得分:0)

问题是你的类Angajat没有不带参数的构造函数。

添加一个不带参数的构造函数给类Angajat,或者查找带有三个参数的构造函数并调用它而不是c.newInstance();

class Angajat {
    // ...

    // Constructor that takes no arguments
    public Angajat() {
    }

    // Constructor that takes three arguments
    public Angajat(String nume, int salariu, int varsta) {
        // ...
    }
}