| /* |
| * Copyright 2008 Google Inc. |
| * |
| * 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 com.google.gwt.dev.shell; |
| |
| import java.lang.reflect.AccessibleObject; |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.InvocationTargetException; |
| import java.lang.reflect.Method; |
| import java.lang.reflect.Modifier; |
| |
| /** |
| * Provides a common adaptor interface for Methods and Constructors. |
| */ |
| public class MethodAdaptor { |
| private final Constructor<?> constructor; |
| private final Class<?> declaringClass; |
| private final int hashCode; |
| private final Method method; |
| private final String name; |
| private final boolean needsThis; |
| private final Class<?>[] paramTypes; |
| private final Class<?> returnType; |
| |
| public MethodAdaptor(Constructor<?> c) { |
| constructor = c; |
| method = null; |
| name = c.getName(); |
| needsThis = false; |
| paramTypes = c.getParameterTypes(); |
| returnType = declaringClass = c.getDeclaringClass(); |
| hashCode = c.hashCode(); |
| } |
| |
| public MethodAdaptor(Method m) { |
| constructor = null; |
| declaringClass = m.getDeclaringClass(); |
| method = m; |
| name = m.getName(); |
| needsThis = !Modifier.isStatic(m.getModifiers()); |
| paramTypes = m.getParameterTypes(); |
| returnType = m.getReturnType(); |
| hashCode = method.hashCode(); |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if (!(o instanceof MethodAdaptor)) { |
| return false; |
| } |
| |
| MethodAdaptor other = (MethodAdaptor) o; |
| if (constructor != null) { |
| return constructor.equals(other.constructor); |
| } else if (method != null) { |
| return method.equals(other.method); |
| } else { |
| throw new RuntimeException("constructor and method are null"); |
| } |
| } |
| |
| public Class<?> getDeclaringClass() { |
| return declaringClass; |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| public Class<?>[] getParameterTypes() { |
| return paramTypes; |
| } |
| |
| public Class<?> getReturnType() { |
| return returnType; |
| } |
| |
| public AccessibleObject getUnderlyingObject() { |
| return (method != null) ? method : constructor; |
| } |
| |
| @Override |
| public int hashCode() { |
| return hashCode; |
| } |
| |
| public Object invoke(Object obj, Object... args) |
| throws InstantiationException, InvocationTargetException, |
| IllegalAccessException { |
| if (method != null) { |
| return method.invoke(obj, args); |
| } else if (constructor != null) { |
| return constructor.newInstance(args); |
| } else { |
| throw new RuntimeException("Nothing to invoke"); |
| } |
| } |
| |
| /** |
| * Indicates whether or not a "this" object is required to invoke the Method |
| * or Constructor. |
| */ |
| public boolean needsThis() { |
| return needsThis; |
| } |
| |
| @Override |
| public final String toString() { |
| return (method != null) ? method.toString() : constructor.toString(); |
| } |
| } |