2017-01-24 9 views
0

inbuilt Java APIを使用して次の問題を解決することは可能ですか?私は、抽象クラスBaseModelのNサブクラスを持ってJava抽出クラスのプライベートフィールドの初期化

  1. (私が示すように、厳密なプライベートアクセスを保持したいです)。
  2. これらのサブクラスのそれぞれは、独自のプライベートStringフィールドのセットを宣言します。
  3. サブクラスのコンストラクタ内で、Java Reflectionを使用してプライベートフィールドをマップから設定したいとします。この関数の例:

    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. が、それは私がサブクラスのすべてのコンストラクタにアルゴリズムを書き換える必要がないように)私は3で説明している機能を抽出することは可能ですか?

    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:言語間の類似性、私は確信しておりませんので、これが唯一のJavaで遭遇した問題があり、それは解決策がJavaのほうが少なく、論理的にはもっと嘘をつく可能性があります...私は間違っているかもしれません。 – abstractx1

+0

可能な複製:http://stackoverflow.com/questions/16428817/convert-a-mapstring-string-to-a-pojo –

+0

@RC:ありがとう、しかし、私はinbuilt Java APIを使用したいと思います。私は私の質問を更新しました。 – abstractx1

答えて

2

あなたは、単にそれがスーパークラスに追加することができます。

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

これは私が記述した問題を解決し、それをそのまま受け入れます。私は、フィールドのアクセシビリティに影響を及ぼさない解決策を模索していると述べていないことをお詫びします。これは、私がこの問題に対してあなたから独立して見つけた唯一の解決策でもあります。あなたのソリューションとお時間をいただきありがとうございます。 – 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()); 
    } 
}