View Javadoc
1 /* 2 * The Apache Software License, Version 1.1 3 * 4 * Copyright (c) 2002 The Apache Software Foundation. All rights 5 * reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in 16 * the documentation and/or other materials provided with the 17 * distribution. 18 * 19 * 3. The end-user documentation included with the redistribution, 20 * if any, must include the following acknowledgment: 21 * "This product includes software developed by the 22 * Apache Software Foundation (http://www.apache.org/)." 23 * Alternately, this acknowledgment may appear in the software itself, 24 * if and wherever such third-party acknowledgments normally appear. 25 * 26 * 4. The names "Apache" and "Apache Software Foundation" must 27 * not be used to endorse or promote products derived from this 28 * software without prior written permission. For written 29 * permission, please contact apache@apache.org. 30 * 31 * 5. Products derived from this software may not be called "Apache", 32 * nor may "Apache" appear in their name, without prior written 33 * permission of the Apache Software Foundation. 34 * 35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 46 * SUCH DAMAGE. 47 * ==================================================================== 48 * 49 * This software consists of voluntary contributions made by many 50 * individuals on behalf of the Apache Software Foundation. For more 51 * information on the Apache Software Foundation, please see 52 * <http://www.apache.org/>;. 53 */ 54 package net.sf.cglib.proxy; 55 56 import java.lang.reflect.Method; 57 import java.util.*; 58 import net.sf.cglib.core.*; 59 import org.objectweb.asm.ClassVisitor; 60 import org.objectweb.asm.Type; 61 62 /*** 63 * @author Chris Nokleberg 64 * @version $Id: MixinEmitter.java,v 1.3 2003/11/06 05:10:52 herbyderby Exp $ 65 */ 66 class MixinEmitter extends ClassEmitter { 67 private static final String FIELD_NAME = "CGLIB$DELEGATES"; 68 private static final Signature CSTRUCT_OBJECT_ARRAY = 69 TypeUtils.parseConstructor("Object[]"); 70 private static final Signature NEW_INSTANCE = 71 TypeUtils.parseSignature("net.sf.cglib.proxy.Mixin newInstance(Object[])"); 72 private static final Type MIXIN = 73 TypeUtils.parseType("net.sf.cglib.proxy.Mixin"); 74 75 public MixinEmitter(ClassVisitor v, String className, Class[] classes, int[] route) { 76 super(v); 77 78 begin_class(Constants.ACC_PUBLIC, 79 className, 80 MIXIN, 81 TypeUtils.getTypes(getInterfaces(classes)), 82 Constants.SOURCE_FILE); 83 EmitUtils.null_constructor(this); 84 EmitUtils.factory_method(this, NEW_INSTANCE); 85 86 declare_field(Constants.ACC_PRIVATE, FIELD_NAME, Constants.TYPE_OBJECT_ARRAY, null, null); 87 88 CodeEmitter e = begin_method(Constants.ACC_PUBLIC, CSTRUCT_OBJECT_ARRAY, null, null); 89 e.load_this(); 90 e.super_invoke_constructor(); 91 e.load_this(); 92 e.load_arg(0); 93 e.putfield(FIELD_NAME); 94 e.return_value(); 95 e.end_method(); 96 97 Set unique = new HashSet(); 98 for (int i = 0; i < classes.length; i++) { 99 Method[] methods = getMethods(classes[i]); 100 for (int j = 0; j < methods.length; j++) { 101 if (unique.add(MethodWrapper.create(methods[j]))) { 102 Method method = methods[j]; 103 e = begin_method(Constants.ACC_PUBLIC, 104 ReflectUtils.getSignature(method), 105 ReflectUtils.getExceptionTypes(method), 106 null); 107 e.load_this(); 108 e.getfield(FIELD_NAME); 109 e.aaload((route != null) ? route[i] : i); 110 e.checkcast(Type.getType(method.getDeclaringClass())); 111 e.load_args(); 112 e.invoke(method); 113 e.return_value(); 114 e.end_method(); 115 } 116 } 117 } 118 119 end_class(); 120 } 121 122 protected Class[] getInterfaces(Class[] classes) { 123 return classes; 124 } 125 126 protected Method[] getMethods(Class type) { 127 return type.getMethods(); 128 } 129 }

This page was automatically generated by Maven