code: @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
      {
          if (constructed)
          {
  
              String methodName = method.getName();
              int params = args.length;
  
              if (params == 0)
              {
                  if (isUninitialized() && method.equals(getIdentifierMethod))
                  {
                      return getIdentifier();
                  }
  
                  else if ("getKunderaLazyInitializer".equals(methodName))
                  {
                      return this;
                  }
              }
  
              Object target = getImplementation();
  
              String[] strArr = entityName.split("#");
              String fieldName = strArr[1];
  
              if (owner != null)
              {
                  EntityMetadata m = KunderaMetadataManager.getEntityMetadata(persistenceDelegator.getKunderaMetadata(),
                          owner.getClass());
                  Relation r = m.getRelation(fieldName);
                  if (r != null)
                  {
                      PropertyAccessorHelper.set(owner, r.getProperty(), target);
                  }
                  if (r.getBiDirectionalField() != null && method.getReturnType().equals(m.getEntityClazz()))
                  {
                      PropertyAccessorHelper.set(target, r.getBiDirectionalField(), owner);
                  }
  
              }
  
              try
              {
                  final Object returnValue;
                  if (method.isAccessible())
                  {
                      if (!method.getDeclaringClass().isInstance(target))
                      {
                          throw new ClassCastException(target.getClass().getName());
                      }
                      returnValue = method.invoke(target, args);
                  }
                  else
                  {
                      if (!method.isAccessible())
                      {
                          method.setAccessible(true);
                      }
                      returnValue = method.invoke(target, args);
                  }
                  return ((returnValue == target) ? proxy : returnValue);
              }
              catch (InvocationTargetException ite)
              {
                  throw new LazyInitializationException(ite);
              }
          }
          else
          {
              // while constructor is running
              throw new LazyInitializationException("unexpected case hit, method=" + method.getName());
          }
  
      }
docs: /*
  (non-Javadoc)
  
  @see net.sf.cglib.proxy.InvocationHandler#invoke(java.lang.Object,
  java.lang.reflect.Method, java.lang.Object[])