2017-01-24 1 views
0

Ist es möglich, das folgende Problem mit eingebautem Java-API zu lösen? (Ich möchte den strengen privaten Zugang zu halten, wie gezeigt)Java Extrahierung initialisieren private Felder einer Klasse aus

  1. Ich habe n Subklassen einer abstrakten Klasse Basemodel.
  2. erklären Jede dieser Unterklassen ihre eigene Reihe von privaten String Feldern aus.
  3. Innerhalb der Unterklasse Konstruktor möchte ich die privaten Felder aus einer Map Reflection mit Hilfe von Java einzustellen. Ein Beispiel für diese Funktion:

    void setPrivateFields(Map<String, String> fieldsValuesMap) throws NoSuchFieldException, IllegalAccessException { 
        for (Map.Entry<String, String> entry : fieldsValuesMap.entrySet()) { 
         String fieldName = entry.getKey(); 
         String fieldValue = entry.getValue(); 
    
         Field field = this.getClass().getDeclaredField(fieldName); 
         field.set(this, fieldValue); 
        } 
    } 
    
  4. Ist es möglich, die Funktion, die ich beschrieben habe in 3), so dass ich den Algorithmus neu zu schreiben, nicht zu extrahieren habe in allen Konstrukteuren der Unterklassen?

    class BaseModel {} 
    
    class Project extends BaseModel { 
        private String name; 
        private String type; 
    
        public Project(Map<String, String> fieldsValuesMap) { 
         setPrivateFields(fieldsValuesMap); 
        } 
    } 
    
    class Task extends BaseModel { 
        private String description; 
        private String rawDescription; 
    
        public Task(Map<String, String> fieldsValuesMap) { 
         setPrivateFields(fieldsValuesMap); 
        } 
    } 
    
    class SubTask extends BaseModel { 
        ... 
    } 
    
    ... 
    
+0

@jaggedSpire: Aufgrund der Ähnlichkeiten zwischen den Sprachen, ich bin nicht überzeugt, dass dies ein Problem in nur Java aufgetreten ist, und es ist plausibel, dass die Lösung weniger in Java und mehr in der Logik liegen mag ... ich könnte mich irren. – abstractx1

+0

Mögliche doppelte: http://stackoverflow.com/questions/16428817/convert-a-mapstring-string-to-a-pojo –

+0

@RC: Vielen Dank, aber ich wünsche API eingebaute Java verwenden. Ich habe meine Frage aktualisiert. – abstractx1

Antwort

2

können Sie einfach fügen Sie ihn in der übergeordneten Klasse.

class BaseModel { 

    protected void setPrivateFields(Map<String, String> fieldsValuesMap) { 
     for (Map.Entry<String, String> entry : fieldsValuesMap.entrySet()) { 
      String fieldName = entry.getKey(); 
      String fieldValue = entry.getValue(); 

      try { 
       Field field = this.getClass().getDeclaredField(fieldName); 
       boolean access = field.isAccessible(); 
       field.setAccessible(true); 
       field.set(this, fieldValue); 
       field.setAccessible(access); 
      } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { 
       e.printStackTrace(); 
      }   
     } 
    } 

} 
+0

Dies löst das Problem, das ich beschrieben habe und wird es so akzeptieren wie es ist. Ich entschuldige mich, dass ich nicht gesagt habe, dass ich eine Lösung suchte, die die Zugänglichkeit des Feldes nicht beeinträchtigt. Dies ist auch die einzige Lösung, die ich unabhängig für dieses Problem gefunden habe. Vielen Dank für Ihre Lösung und für Ihre Zeit. – abstractx1

0

BaseModel.java

abstract class BaseModel { 

} 

Project.java

import java.util.Map; 

class Project extends BaseModel { 
    private String name; 
    private String type; 

    public Project(Map<String, String> fieldsValuesMap) throws NoSuchFieldException, IllegalAccessException { 
     Utils.setPrivateFields(this, fieldsValuesMap); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 
} 

Task.java

import java.util.Map; 

class Task extends BaseModel { 
    private String description; 
    private String rawDescription; 

    public Task(Map<String, String> fieldsValuesMap) throws NoSuchFieldException, IllegalAccessException { 
     Utils.setPrivateFields(this, fieldsValuesMap); 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getRawDescription() { 
     return rawDescription; 
    } 

    public void setRawDescription(String rawDescription) { 
     this.rawDescription = rawDescription; 
    } 
} 

Utils.java

import java.lang.reflect.Field; 
import java.util.Map; 

public class Utils { 
    static void setPrivateFields(BaseModel baseModel, Map<String, String> fieldsValuesMap) throws NoSuchFieldException, IllegalAccessException { 
     for (Map.Entry<String, String> entry : fieldsValuesMap.entrySet()) { 
      String fieldName = entry.getKey(); 
      String fieldValue = entry.getValue(); 

      Field field = baseModel.getClass().getDeclaredField(fieldName); 
      field.setAccessible(true); 
      field.set(baseModel, fieldValue); 
     } 
    } 
} 

Main.java

import java.util.HashMap; 
import java.util.Map; 

public class Main { 

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { 
     Map<String, String> map = new HashMap<>(); 
     map.put("name", "ABC"); 
     map.put("type", "XYZ"); 
     Project project = new Project(map); 
     System.out.println(project.getName()); 
     System.out.println(project.getType()); 
    } 
} 
Verwandte Themen