001    /*
002      Copyright (C) 2004 Laurent Martelli <laurent@aopsys.com>
003    
004      This program is free software; you can redistribute it and/or modify
005      it under the terms of the GNU Lesser General Public License as
006      published by the Free Software Foundation; either version 2 of the
007      License, or (at your option) any later version.
008    
009      This program is distributed in the hope that it will be useful,
010      but WITHOUT ANY WARRANTY; without even the implied warranty of
011      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012      GNU Lesser General Public License for more details.
013    
014      You should have received a copy of the GNU Lesser General Public
015      License along with this program; if not, write to the Free Software
016      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
017      USA */
018    
019    package org.objectweb.jac.core.rtti;
020    
021    import java.lang.reflect.Method;
022    import java.lang.reflect.Modifier;
023    import org.objectweb.jac.util.ExtArrays;
024    
025    public class MixinMethodItem extends MethodItem {
026        public MixinMethodItem(Method method, ClassItem parent) 
027            throws InvalidDelegateException 
028        {
029            super(method,parent);
030            if (!Modifier.isStatic(method.getModifiers())) 
031                throw new InvalidDelegateException(delegate,"Mixin method is not static");
032            if (!method.getParameterTypes()[0].isAssignableFrom((Class)parent.getDelegate()))
033                throw new InvalidDelegateException(
034                    delegate,"1st parameter of mixin method should be "+parent.getName());
035            paramTypes = (Class[])ExtArrays.subArray(method.getParameterTypes(),1);
036        }
037    
038        /**
039         * Invoke as a static method, prepending object at the beginning
040         * of parameters.
041         */
042        public Object invoke(Object object, Object[] parameters) {
043            return invokeStatic(ExtArrays.add(0, object, parameters));
044        }
045    
046        Class[] paramTypes;
047        public Class[] getParameterTypes() {
048            return paramTypes;
049        }
050    
051        public void setParameter(Object[] params, int i, Object value) {
052            params[i+1] = value;
053        }
054        public Object getParameter(Object[] params, int i) {
055            return params[i+1];
056        }
057    }