title: java.lang.IllegalArgumentException thrown when trying to an set instance by reflection
body: <p>My goal is to create an instance for a class while invoking its getter method,  after that set a value for the new instance fields. (in this case, shown at the code the class is a String, but it could be another class "Like Person class")</p>
  
  <p>...Entity annotation:</p>
  
  <pre><code>@Retention(RetentionPolicy.RUNTIME)
  @Target({ElementType.METHOD, ElementType.FIELD})
  public @interface Entity {
  
      String visibileName();
  
  }
  </code></pre>
  
  <p>...implements<code>IEventDesignDialog</code></p>
  
  <pre><code>      public class EventDesignDialog implements IEventDesignDialog{
  
          private String show;
          private String dateAndTimeDisplayFormat;
          private String eventType;
  
  
          @Entity(visibileName = "Show")
          public String getShow() {
              return this.show;
          }
  
          @Entity(visibileName = "Date And Time display format")
          public String getDateAndTimeDisplayFormat() {
              return this.dateAndTimeDisplayFormat;
          }
  
          @Entity(visibileName = "Event Type")
          public String getEventType() {
              System.out.println("get event type method invokde successfully");
              return this.eventType;
          }
  }
  </code></pre>
  
  <p><code>IEventDesignDialog</code> interface:</p>
  
  <pre><code>public interface IEventDesignDialog extends IPage{
  
      public String getShow();
  
      public String getDateAndTimeDisplayFormat();
  
      public String getEventType();
  
  
  }
  </code></pre>
  
  <p><code>IPage</code> interface:</p>
  
  <pre><code>public interface IPage {
  
  }
  </code></pre>
  
  <p>Dynamic proxy implementation:</p>
  
  <pre><code>public class IPageProxy implements InvocationHandler {
      private List&lt;Method&gt; entityMethods;
  
  
  
      private Class &lt;? extends IPage&gt; screenClazz;
  
      public IPageProxy(final Class &lt;? extends IPage&gt; screenClazz) {
          entityMethods = new ArrayList&lt;&gt;();
          getEntityAnnotatedMethods(screenClazz);
          // Accept the real implementation to be proxied
          this.screenClazz = screenClazz;
      }
  
  
      /**
       * create an page instance
       * @param type
       * @param
       * @return
       * @throws InstantiationException
       * @throws IllegalAccessException
       */
      public static IPage getInstance(final Class&lt;? extends IPage&gt; type)
              throws InstantiationException, IllegalAccessException {
  
          List&lt;Class&lt;?&gt;&gt; interfaces = new ArrayList&lt;&gt;();
          interfaces.addAll(Arrays.asList(type.getInterfaces()));
  
          return (IPage) Proxy.newProxyInstance(
                  type.getClassLoader(),
                  findInterfaces(type),
                  new IPageProxy(type)
               );
  
          /*return (IPage) Proxy.newProxyInstance(type.getClassLoader(),
                 interfaces.toArray(new Class&lt;?&gt;[interfaces.size()])
                  , new IPageProxy(type));*/
      }
  
  
      /**
       * get all methods that annotated with @Entity annotation
       * and add it for entityMethods array List
       * @param screenClazz
       */
      private void getEntityAnnotatedMethods(final Class &lt;? extends IPage&gt;  screenClazz) {
          // Scan each interface method for the specific annotation
          // and save each compatible method
          for (final Method m : screenClazz.getDeclaredMethods()) {
              if (m.isAnnotationPresent(Entity.class)) {
                  entityMethods.add(m);
              }
          }
      }
  
  
      static Class&lt;?&gt;[] findInterfaces(final Class&lt;? extends IPage&gt; type) {
          Class&lt;?&gt; current = type;
  
          do {
              final Class&lt;?&gt;[] interfaces = current.getInterfaces();
  
              if (interfaces.length != 0) {
                  return interfaces;
              }
          } while ((current = current.getSuperclass()) != Object.class);
  
          throw new UnsupportedOperationException("The type does not implement any interface");
      }
  
  
  
    @Override
  public Object invoke(final Object proxy, final Method method, final Object[] args) throws InvocationTargetException,
          IllegalAccessException, IllegalArgumentException, InstantiationException, ParserConfigurationException, XPathExpressionException, NoSuchFieldException, SecurityException {
  
      Method methodToInvoke = null;
  
      for (Method methodFromClass : screenClazz.getMethods()) {
          if (methodFromClass.getName().equals(method.getName())) {
              methodToInvoke = methodFromClass;
              break;
          }
      }
  
  
  
      String fieldName = method.getName().replaceAll("get", "");
      fieldName = Character.toLowerCase(fieldName.charAt(0)) + fieldName.substring(1, fieldName.length());
  
      Field getterMethodField = methodToInvoke.getDeclaringClass().getDeclaredField(fieldName);
      getterMethodField.setAccessible(true);
  
      Class&lt;?&gt; returnedType = method.getReturnType();
  
      try {
          *getterMethodField.set(getterMethodField.getType().newInstance(), "");*
      }catch (Exception e) {
          e.printStackTrace();
      }
  
  
      return methodToInvoke.invoke(screenClazz.newInstance(), args);
  }
  </code></pre>
  
  <p>Main class:</p>
  
  <pre><code>public class Main {
  
      public static void main(String[] args) {
          try {
  
              ((EventDesignDialog)getInstance(EventDesignDialog.class)).getEventType();
          } catch (InstantiationException | IllegalAccessException e) {
              e.printStackTrace();
          }
      }
  
  
      @SuppressWarnings("unchecked")
      public static &lt;T extends IPage&gt; T getInstance(final Class&lt;? extends IPage&gt; type) throws InstantiationException, IllegalAccessException {
          return (T) IPageProxy.getInstance(type);
      }
  
  }
  </code></pre>
  
  <p>The following exception is thrown when this line of code at invoke method:
   <em>getterMethodField.set(getterMethodField.getType().newInstance(), "");</em></p>
  
  <pre><code> java.lang.IllegalArgumentException: Can not set java.lang.String field abc.EventDesignDialog.eventType to java.lang.String
  at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
  at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
  at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
  at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75)
  at java.lang.reflect.Field.set(Field.java:764)
  at abc.IPageProxy.invoke(IPageProxy.java:173)
  at com.sun.proxy.$Proxy2.getEventType(Unknown Source)
  at abc.Main.main(Main.java:9)
  </code></pre>