class HotswapSpringInvocationHandler extends DetachableBeanHolder implements InvocationHandler {

    private static final long serialVersionUID = 8037007940960065166L;

    /**
     * @param beanFactry   Spring beanFactory
     * @param bean         Spring bean
     * @param paramClasses Parameter Classes of the Spring beanFactory method which returned the bean. The method is named
     *                     ProxyReplacer.FACTORY_METHOD_NAME
     * @param paramValues  Parameter values of the Spring beanFactory method which returned the bean. The method is named
     *                     ProxyReplacer.FACTORY_METHOD_NAME
     */
    public HotswapSpringInvocationHandler(Object bean, Object beanFactry, Class<?>[] paramClasses, Object[] paramValues) {
        super(bean, beanFactry, paramClasses, paramValues);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (method.getName().equals("getWrappedObject")
                && method.getDeclaringClass().getName().equals("org.springframework.core.InfrastructureProxy")) {
            for (Class<?> beanInterface : getBean().getClass().getInterfaces()) {
                if (beanInterface.getName().equals("org.springframework.core.InfrastructureProxy")) {
                    return doInvoke(method, args);
                }
            }
            return getBean();
        }
        return doInvoke(method, args);
    }

    private Object doInvoke(Method method, Object[] args) throws Throwable {<FILL_FUNCTION_BODY>}
}

        try {
            return method.invoke(getBean(), args);
        } catch (InvocationTargetException e) {
            throw e.getCause();
        }
    
<methods>public void <init>(java.lang.Object, java.lang.Object, Class<?>[], java.lang.Object[]) ,public void detach() ,public static void detachBeans() ,public java.lang.Object getBean() throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException,public java.lang.Object getTarget() ,public void setTarget(java.lang.Object) <variables>private static org.hotswap.agent.logging.AgentLogger LOGGER,private java.lang.Object bean,private java.lang.Object beanFactory,private static List<WeakReference<org.hotswap.agent.plugin.spring.getbean.DetachableBeanHolder>> beanProxies,private Class<?>[] paramClasses,private java.lang.Object[] paramValues,private static final long serialVersionUID