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 }