All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.taketoday.aop.cglib.proxy.InvocationHandlerGenerator Maven / Gradle / Ivy

/*
 * Copyright 2003,2004 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cn.taketoday.aop.cglib.proxy;

import java.util.Iterator;
import java.util.List;

import cn.taketoday.aop.Constant;
import cn.taketoday.aop.cglib.core.Block;
import cn.taketoday.aop.cglib.core.ClassEmitter;
import cn.taketoday.aop.cglib.core.CodeEmitter;
import cn.taketoday.aop.cglib.core.EmitUtils;
import cn.taketoday.aop.cglib.core.MethodInfo;
import cn.taketoday.aop.cglib.core.Signature;
import cn.taketoday.aop.cglib.core.TypeUtils;
import cn.taketoday.context.asm.Type;

@SuppressWarnings("all")
class InvocationHandlerGenerator implements CallbackGenerator {
	public static final InvocationHandlerGenerator INSTANCE = new InvocationHandlerGenerator();

	private static final Type INVOCATION_HANDLER = TypeUtils
			.parseType("cn.taketoday.aop.cglib.proxy.InvocationHandler");
	private static final Type UNDECLARED_THROWABLE_EXCEPTION = TypeUtils
			.parseType("cn.taketoday.aop.cglib.proxy.UndeclaredThrowableException");
	private static final Type METHOD = TypeUtils.parseType("java.lang.reflect.Method");
	private static final Signature INVOKE = TypeUtils
			.parseSignature("Object invoke(Object, java.lang.reflect.Method, Object[])");

	public void generate(ClassEmitter ce, Context context, List methods) {
		for (Iterator it = methods.iterator(); it.hasNext();) {
			MethodInfo method = (MethodInfo) it.next();
			Signature impl = context.getImplSignature(method);
			ce.declare_field(Constant.PRIVATE_FINAL_STATIC, impl.getName(), METHOD, null);

			CodeEmitter e = context.beginMethod(ce, method);
			Block handler = e.begin_block();
			context.emitCallback(e, context.getIndex(method));
			e.load_this();
			e.getfield(impl.getName());
			e.create_arg_array();
			e.invoke_interface(INVOCATION_HANDLER, INVOKE);
			e.unbox(method.getSignature().getReturnType());
			e.return_value();
			handler.end();
			EmitUtils.wrap_undeclared_throwable(e, handler, method.getExceptionTypes(), UNDECLARED_THROWABLE_EXCEPTION);
			e.end_method();
		}
	}

	public void generateStatic(CodeEmitter e, Context context, List methods) {
		for (Iterator it = methods.iterator(); it.hasNext();) {
			MethodInfo method = (MethodInfo) it.next();
			EmitUtils.load_method(e, method);
			e.putfield(context.getImplSignature(method).getName());
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy