2016-07-13 9 views
5

Uczę się groovy i próbuję zainicjować moją klasę dynamicznie z wartości domyślnych dla wszystkich pól. Tak jak ja postępuje się, biorę listę wszystkich właściwości i coraz rodzaj tego obiektu i utworzenie obiektu typu, ale jestem coraz błąd podczas wykonywania newInstance:Nie można znaleźć metody <init>() do wywołania z tej listy na newInstance w groovy zamknięcie

Exception in thread "main" org.codehaus.groovy.runtime.metaclass.MethodSelectionException: Could not find which method <init>() to invoke from this list: 
    public java.lang.Boolean#<init>(boolean) 
    public java.lang.Boolean#<init>(java.lang.String) 
    at groovy.lang.MetaClassImpl.chooseMethodInternal(MetaClassImpl.java:3160) 
    at groovy.lang.MetaClassImpl.chooseMethod(MetaClassImpl.java:3097) 
    at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1707) 
    at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1526) 

Poniżej znajduje się Kod

public static void init() { 
     Position position1 = new Position(); 

     JXPathContext context = JXPathContext.newContext(position1) 
     context.createPathAndSetValue('id', '2') 

     position1.properties.each { Map.Entry entry -> 
      String propertyName = entry.key; 
      if (!propertyName.equalsIgnoreCase('class')) { 
       Class clazz = position1.class.getDeclaredField(propertyName)?.type 
       println "$clazz" 
       Object ob = clazz.newInstance() 
      } 

     } 
     Identifier sourceSystemPositionId = new Identifier() 

     context.setValue('sourceSystemPositionId/content', 'default-content') 
     context.setValue('sourceSystemPositionId/domain', 'default-domain') 

     println "$position1" 
    } 
+0

Próbujesz aby utworzyć nowy obiekt 'java.lang.Boolean', ale klasa' java.lang.Boolean' nie ma konstruktora, który nie przyjmuje argumentów. – Jesper

Odpowiedz

4

Zobacz na java docs dla java.lang.Boolean. Jak widać w sekcji Constructor Summary nie ma konstruktora no-arg (i to jest to, co mówi wyjątek) dla tej klasy. Trzeba albo:

  • powołać go (konstruktora) z boolean lub String argumentu
  • użycie Domyślna wartość Boolean - która jest false
  • zainicjować wartości z Boolean.FALSE lub Boolean.TRUE