title: Java Reflection invoke nested method from static class
body: <p>I am using myBatis and I need to call generated <em>andFieldEqualTo</em> method using Java Reflection.</p>
  
  <pre><code>Class&lt;?&gt; cls = Class.forName("com.example.model.MyBatisExample");
  Object obj = cls.newInstance();
  Method method =  cls.getDeclaredMethod("createCriteria");
  Method method2 = method.invoke(obj).getClass().getDeclaredMethod("andFieldEqualTo", String.class);
  </code></pre>
  
  <p>When I run the code above I get this error:</p>
  
  <p><em>java.lang.NoSuchMethodException: com.oneconnectft.sg.smartdocu.model.UserGroupExample$Criteria.andFieldEqualTo(java.lang.String)</em></p>
  
  <p>For Reference this is the MyBatisExample class</p>
  
  <pre><code>package com.example.model;
  
  import java.util.ArrayList;
  import java.util.List;
  
  public class MyBatisExample {
      /**
       * This field was generated by MyBatis Generator.
       * This field corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      protected String orderByClause;
  
      /**
       * This field was generated by MyBatis Generator.
       * This field corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      protected boolean distinct;
  
      /**
       * This field was generated by MyBatis Generator.
       * This field corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      protected List&lt;Criteria&gt; oredCriteria;
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public MyBatisExample() {
          oredCriteria = new ArrayList&lt;Criteria&gt;();
      }
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public void setOrderByClause(String orderByClause) {
          this.orderByClause = orderByClause;
      }
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public String getOrderByClause() {
          return orderByClause;
      }
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public void setDistinct(boolean distinct) {
          this.distinct = distinct;
      }
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public boolean isDistinct() {
          return distinct;
      }
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public List&lt;Criteria&gt; getOredCriteria() {
          return oredCriteria;
      }
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public void or(Criteria criteria) {
          oredCriteria.add(criteria);
      }
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public Criteria or() {
          Criteria criteria = createCriteriaInternal();
          oredCriteria.add(criteria);
          return criteria;
      }
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public Criteria createCriteria() {
          Criteria criteria = createCriteriaInternal();
          if (oredCriteria.size() == 0) {
              oredCriteria.add(criteria);
          }
          return criteria;
      }
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      protected Criteria createCriteriaInternal() {
          Criteria criteria = new Criteria();
          return criteria;
      }
  
      /**
       * This method was generated by MyBatis Generator.
       * This method corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public void clear() {
          oredCriteria.clear();
          orderByClause = null;
          distinct = false;
      }
  
      /**
       * This class was generated by MyBatis Generator.
       * This class corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      protected abstract static class GeneratedCriteria {
          protected List&lt;Criterion&gt; criteria;
  
          protected GeneratedCriteria() {
              super();
              criteria = new ArrayList&lt;Criterion&gt;();
          }
  
          public boolean isValid() {
              return criteria.size() &gt; 0;
          }
  
          public List&lt;Criterion&gt; getAllCriteria() {
              return criteria;
          }
  
          public List&lt;Criterion&gt; getCriteria() {
              return criteria;
          }
  
          protected void addCriterion(String condition) {
              if (condition == null) {
                  throw new RuntimeException("Value for condition cannot be null");
              }
              criteria.add(new Criterion(condition));
          }
  
          protected void addCriterion(String condition, Object value, String property) {
              if (value == null) {
                  throw new RuntimeException("Value for " + property + " cannot be null");
              }
              criteria.add(new Criterion(condition, value));
          }
  
          protected void addCriterion(String condition, Object value1, Object value2, String property) {
              if (value1 == null || value2 == null) {
                  throw new RuntimeException("Between values for " + property + " cannot be null");
              }
              criteria.add(new Criterion(condition, value1, value2));
          }
  
          public Criteria andFieldIsNull() {
              addCriterion("field is null");
              return (Criteria) this;
          }
  
          public Criteria andFieldIsNotNull() {
              addCriterion("field is not null");
              return (Criteria) this;
          }
  
          public Criteria andFieldEqualTo(String value) {
              addCriterion("field =", value, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldNotEqualTo(String value) {
              addCriterion("field &lt;&gt;", value, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldGreaterThan(String value) {
              addCriterion("field &gt;", value, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldGreaterThanOrEqualTo(String value) {
              addCriterion("field &gt;=", value, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldLessThan(String value) {
              addCriterion("field &lt;", value, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldLessThanOrEqualTo(String value) {
              addCriterion("field &lt;=", value, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldLike(String value) {
              addCriterion("field like", value, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldNotLike(String value) {
              addCriterion("field not like", value, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldIn(List&lt;String&gt; values) {
              addCriterion("field in", values, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldNotIn(List&lt;String&gt; values) {
              addCriterion("field not in", values, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldBetween(String value1, String value2) {
              addCriterion("field between", value1, value2, "field");
              return (Criteria) this;
          }
  
          public Criteria andFieldNotBetween(String value1, String value2) {
              addCriterion("field not between", value1, value2, "field");
              return (Criteria) this;
          }
      }
  
      /**
       * This class was generated by MyBatis Generator.
       * This class corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated do_not_delete_during_merge Fri Nov 08 16:30:42 CST 2019
       */
      public static class Criteria extends GeneratedCriteria {
  
          protected Criteria() {
              super();
          }
      }
  
      /**
       * This class was generated by MyBatis Generator.
       * This class corresponds to the database table smrtdocu.MY_BATIS
       *
       * @mbg.generated Fri Nov 08 16:30:42 CST 2019
       */
      public static class Criterion {
          private String condition;
  
          private Object value;
  
          private Object secondValue;
  
          private boolean noValue;
  
          private boolean singleValue;
  
          private boolean betweenValue;
  
          private boolean listValue;
  
          private String typeHandler;
  
          public String getCondition() {
              return condition;
          }
  
          public Object getValue() {
              return value;
          }
  
          public Object getSecondValue() {
              return secondValue;
          }
  
          public boolean isNoValue() {
              return noValue;
          }
  
          public boolean isSingleValue() {
              return singleValue;
          }
  
          public boolean isBetweenValue() {
              return betweenValue;
          }
  
          public boolean isListValue() {
              return listValue;
          }
  
          public String getTypeHandler() {
              return typeHandler;
          }
  
          protected Criterion(String condition) {
              super();
              this.condition = condition;
              this.typeHandler = null;
              this.noValue = true;
          }
  
          protected Criterion(String condition, Object value, String typeHandler) {
              super();
              this.condition = condition;
              this.value = value;
              this.typeHandler = typeHandler;
              if (value instanceof List&lt;?&gt;) {
                  this.listValue = true;
              } else {
                  this.singleValue = true;
              }
          }
  
          protected Criterion(String condition, Object value) {
              this(condition, value, null);
          }
  
          protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
              super();
              this.condition = condition;
              this.value = value;
              this.secondValue = secondValue;
              this.typeHandler = typeHandler;
              this.betweenValue = true;
          }
  
          protected Criterion(String condition, Object value, Object secondValue) {
              this(condition, value, secondValue, null);
          }
      }
  }
  
  </code></pre>