private Class<? extends MethodInvocation> generateMethodInvocation(Class<? extends MethodInvocation> adviceClass, Class<?> type, final Method method) {
		DummyClass dummy = new DummyClass(type.getName() + StringUtils.upperCase(method.getName(), 0, 1) + "MethodInvocation")
		                   .public_().extends_(adviceClass).setClassOutPutPath(SampleConstant.classOutPutPath);
		
		dummy.newField(type, "target").private_();
		
		dummy.newConstructor().public_().argTypes(type).body(new ConstructorBody() {

			@Override
			public void body(LocVar... args) {
				supercall();
				assign(this_().field("target"), args[0]);
				return_();
			}
			
		});
		
		dummy.newMethod("callOrigin").protected_().return_(Object.class).argTypes(Object[].class).varargs()
		     .body(new MethodBody() {

			@Override
			public void body(LocVar... args) {
				Class<?>[] types = method.getParameterTypes();
				Param[] arguments = new Param[types.length];
				for(int i=0; i<arguments.length; i++) {
					arguments[i] = checkcast(arrayLoad(args[0], val(i)), types[i]);
				}
				
				if(method.getReturnType() == void.class) {
					call(this_().field("target"), method.getName(), arguments);
					return_(super_().field("VOID_OBJ"));
				} else {
					return_(call(this_().field("target"), method.getName(), arguments));
				}
			}
			
		});
		
		return (Class<? extends MethodInvocation>) dummy.build();
	}