apiclass.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 368 行

JAVA
368
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.ejb.cfg;import java.util.*;import java.lang.reflect.*;import java.lang.annotation.*;import com.caucho.ejb.cfg.*;import com.caucho.util.*;/** * Represents an interface class, either Local or Remote */public class ApiClass {  private static final L10N L = new L10N(ApiClass.class);  public static final ApiClass OBJECT = new ApiClass(Object.class);  public static final ApiClass ENTITY_BEAN    = new ApiClass(javax.ejb.EntityBean.class);  private Class _apiClass;  private HashMap<String,Type> _typeMap;  private ArrayList<Type> _typeParam;      private ArrayList<ApiMethod> _methods = new ArrayList<ApiMethod>();  private ArrayList<ApiClass> _interfaces = new ArrayList<ApiClass>();    /**   * Creates a new api class   *   * @param topClass the api class   */  public ApiClass(Class apiClass)  {    this(apiClass, null);  }    /**   * Creates a new api class   *   * @param topClass the api class   */  public ApiClass(Class apiClass, HashMap<String,Type> parentTypeMap)  {    if (apiClass == null)      throw new NullPointerException();        _apiClass = apiClass;    _typeMap = new HashMap<String,Type>();    if (parentTypeMap != null) {      _typeMap.putAll(parentTypeMap);    }    introspectClass(apiClass, _typeMap);  }    /**   * Creates a new api class   *   * @param topClass the api class   */  public ApiClass(Class apiClass,		  HashMap<String,Type> parentTypeMap,		  ArrayList<Type> param)  {    this(apiClass, parentTypeMap);    _typeParam = param;  }  /**   * Returns the classname.   */  public String getName()  {    return _apiClass.getName();  }  /**   * Returns the short classname.   */  public String getSimpleName()  {    return _apiClass.getSimpleName();  }  /**   * Returns the declaration name   */  public String getDeclarationName()  {    if (_typeParam == null || _typeParam.size() == 0)      return _apiClass.getName();        StringBuilder sb = new StringBuilder();    sb.append(_apiClass.getName());    sb.append("<");    for (int i = 0; i < _typeParam.size(); i++) {      if (i != 0)	sb.append(",");      Type type = (Type) _typeParam.get(i);      if (type instanceof Class) {	sb.append(((Class) type).getName());      }      else if (type instanceof ParameterizedType) {	ParameterizedType pType = (ParameterizedType) type;	Class rawType = (Class) pType.getRawType();	sb.append(rawType.getName());      }      else	throw new UnsupportedOperationException();    }        sb.append(">");    return sb.toString();  }  /**   * Returns the type map   */  public HashMap<String,Type> getTypeMap()  {    return _typeMap;  }  public Class getJavaClass()  {    return _apiClass;  }  /**   * Returns true for a public class.   */  public boolean isPublic()  {    return Modifier.isPublic(_apiClass.getModifiers());  }  /**   * Returns true for an interface   */  public boolean isInterface()  {    return Modifier.isInterface(_apiClass.getModifiers());  }  /**   * Returns true for an abstract class   */  public boolean isAbstract()  {    return Modifier.isAbstract(_apiClass.getModifiers());  }  /**   * Returns true for a final class   */  public boolean isFinal()  {    return Modifier.isFinal(_apiClass.getModifiers());  }  /**   * Returns true for a primitive class   */  public boolean isPrimitive()  {    return _apiClass.isPrimitive();  }  /**   * Returns the fields.   */  public Field []getFields()  {    return _apiClass.getFields();  }  /**   * Returns the interfaces (should be ApiClass?)   */  public ArrayList<ApiClass> getInterfaces()  {    // return _apiClass.getInterfaces();    return _interfaces;  }  public Constructor getConstructor(Class []param)    throws NoSuchMethodException  {    return _apiClass.getConstructor(param);  }  /**   * Returns the methods.   */  public ArrayList<ApiMethod> getMethods()  {    return _methods;  }  /**   * Returns the matching method.   */  public ApiMethod getMethod(Method method)  {    return getMethod(method.getName(), method.getParameterTypes());  }  /**   * Returns the matching method.   */  public ApiMethod getMethod(ApiMethod method)  {    return getMethod(method.getName(), method.getParameterTypes());  }    /**   * Returns true if the method exists   */  public boolean hasMethod(String name, Class []args)  {    return getMethod(name, args) != null;  }  /**   * Returns the matching method.   */  public ApiMethod getMethod(String name, Class []param)  {    for (int i = 0; i < _methods.size(); i++) {      ApiMethod method = _methods.get(i);      if (method.isMatch(name, param))	return method;    }    return null;  }  /**   * Returns true if the annotation exists.   */  public boolean isAnnotationPresent(Class annType)  {    return _apiClass.isAnnotationPresent(annType);  }  /**   * Returns true if the annotation exists.   */  public <A extends Annotation> A getAnnotation(Class<A> annType)  {    return (A) _apiClass.getAnnotation(annType);  }  private void introspectClass(Class cl, HashMap<String,Type> typeMap)  {    if (cl == null)      return;    HashSet<ApiMethod> methodSet = new HashSet<ApiMethod>();        for (Method method : cl.getDeclaredMethods()) {      ApiMethod apiMethod = new ApiMethod(this, method, typeMap);      methodSet.add(apiMethod);    }    _methods.addAll(methodSet);    introspectGenericClass(cl.getGenericSuperclass(), typeMap);    for (Type subClass : cl.getGenericInterfaces()) {      ApiClass iface = introspectGenericClass(subClass, typeMap);      if (cl == _apiClass && iface != null)	_interfaces.add(iface);    }  }  private ApiClass introspectGenericClass(Type type,					  HashMap<String,Type> typeMap)  {    if (type == null)      return null;    if (type instanceof Class) {      introspectClass((Class) type, typeMap);      return new ApiClass((Class) type);    }    else if (type instanceof ParameterizedType) {      ParameterizedType pType = (ParameterizedType) type;      Type []args = pType.getActualTypeArguments();            Class rawType = (Class) pType.getRawType();      TypeVariable []params = rawType.getTypeParameters();      HashMap<String,Type> subMap = new HashMap<String,Type>(typeMap);      ArrayList<Type> paramList = new ArrayList<Type>();      for (int i = 0; i < params.length; i++) {	TypeVariable param = params[i];	Type arg = args[i];	if (arg instanceof TypeVariable) {	  TypeVariable argVar = (TypeVariable) arg;	  if (typeMap.get(argVar.getName()) != null)	    arg = typeMap.get(argVar.getName());	}	subMap.put(param.getName(), arg);	paramList.add(arg);      }      introspectClass(rawType, subMap);      return new ApiClass(rawType, subMap, paramList);    }    else      return null;  }  public String toString()  {    return "ApiClass[" + _apiClass.getName() + "]";  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?