2016-09-01 10 views
-1

オブジェクトの作成に問題があります。クラスの作成と文字列からのインスタンスの作成

基本的には、元々文字列を取り、指定されたクラスからオブジェクトを作成したいと考えています。私はClass.forName(field)を使用していることを知っていますが、私の場合はそうではありません。私は反射について考えましたが、同じ問題を引き起こす恐れがあります。今のよう

私のコードは、(テンプレートが文字列である)である:

int n = template.length(); 
String field = at.getFieldName().trim(); 
field = field.substring(0, field.length() - 1); 
Class<?> correctClass = Class.forName(field); 
UniqueEntity<correctClass> ue = new UniqueEntity<correctClass>(); 

私が取得エラーメッセージがcorrectClassを型に解決できないということです。

+2

'correctClass'が可変である - ないタイプ! –

+0

私はそれを理解しましたが、回避策について考えていますか? – pims51

+0

重複http://stackoverflow.com/questions/356583/can-i-reflectively-instantiate-a-generic-type-in​​-java –

答えて

0

あなたはあなたのClassインスタンスを得たClass.forName()方法(変数correctClass)クラスConstructorのインスタンスを取得する方法getConstructor()またはgetConstructors()を呼び出すを使用したら。 Constructorクラスのインスタンスを取得したら、メソッドnewInstance()を呼び出してクラスのインスタンスを取得します。ここに例があります:

Class myClass = Class.forName(field); 
Constructor constructor = myClass.getConstructor() 
Object o = constructor.newInstance() 

これらはすべて、あなたのクラスにデフォルトのコンストラクタがあることを前提としています。

0

反射クラスのタイプをUniqueEntityにするには、クラスタイプをジェネリックヘルパーメソッドに渡す必要があります。

private static <T> UniqueEntity<T> createEntity(Class<T> clazz) { 
    return new UniqueEntity<T>(clazz); 
} 

コード

import java.lang.reflect.Type; 

public class Generic { 
    public static void main(String[] args) { 
     try { 
      String field = "java.lang.Integer"; 
      UniqueEntity<?> entity = fromField(field); 

      System.out.println(entity); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static UniqueEntity<?> fromField(String field) throws ClassNotFoundException { 
     return createEntity(Class.forName(field)); 
    } 

    private static <T> UniqueEntity<T> createEntity(Class<T> clazz) { 
     return new UniqueEntity<T>(clazz); 
    } 

    private static class UniqueEntity<T> { 
     private final Type type; 

     public UniqueEntity(Class<T> clazz) { 
      this.type = clazz.getGenericSuperclass(); 
     } 

     @Override 
     public String toString() { 
      return "UniqueEntity [type=" + type + "]"; 
     } 
    } 
} 
関連する問題