1 /** 2 * EasyBeans 3 * Copyright (C) 2006 Bull S.A.S. 4 * Contact: easybeans@objectweb.org 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 19 * USA 20 * 21 * -------------------------------------------------------------------------- 22 * $Id: JMethod.java 47 2006-02-28 10:42:29Z benoitf $ 23 * -------------------------------------------------------------------------- 24 */ 25 26 package com.bm.ejb3metadata.annotations; 27 28 import java.lang.reflect.Method; 29 import java.util.Arrays; 30 31 import org.hibernate.repackage.cglib.asm.Type; 32 33 /** 34 * This class defines a Method object. It is not based on reflection but allows 35 * to build a JMethod based on java.lang.reflect.Method 36 * @author Florent Benoit 37 */ 38 public class JMethod { 39 40 /** 41 * Name of the method. 42 */ 43 private String name = null; 44 45 /** 46 * Access mode (see {@link org.ejb3unit.asm.Opcodes}). 47 */ 48 private int access; 49 50 /** 51 * Method's descriptor. 52 */ 53 private String descriptor = null; 54 55 /** 56 * Method's signature. 57 */ 58 private String signature; 59 60 /** 61 * Exceptions of the method. 62 */ 63 private String[] exceptions; 64 65 /** 66 * Constructor. 67 * @param access the access mode (see {@link org.ejb3unit.asm.Opcodes}) 68 * @param name the method's name. 69 * @param descriptor the method's descriptor (see 70 * {@link org.ejb3unit.asm.Type Type}). 71 * @param signature the method's signature. May be <tt>null</tt> if the 72 * method parameters, return type and exceptions do not use generic 73 * types. 74 * @param exceptions the internal names of the method's exception classes 75 * (see 76 * {@link org.ejb3unit.asm.Type#getInternalName() getInternalName}). 77 * May be <tt>null</tt>. 78 */ 79 public JMethod(final int access, final String name, final String descriptor, final String signature, 80 final String[] exceptions) { 81 this.access = access; 82 this.name = name; 83 this.descriptor = descriptor; 84 this.signature = signature; 85 this.exceptions = exceptions; 86 } 87 88 /** 89 * the access mode (see {@link org.ejb3unit.asm.Opcodes}). 90 * @return the access mode (see {@link org.ejb3unit.asm.Opcodes}) 91 */ 92 public int getAccess() { 93 return access; 94 } 95 96 /** 97 * Constructor. 98 * @param m {@link java.lang.reflect.Method} method. 99 */ 100 public JMethod(final Method m) { 101 this.name = m.getName(); 102 this.descriptor = Type.getMethodDescriptor(m); 103 // FIXME: make this ok 104 // this.signature = Type.signature; 105 // this.exceptions = exceptions; 106 } 107 108 /** 109 * Indicates whether some other object is "equal to" this one. 110 * @param obj object to compare 111 * @return true if given object is equals 112 */ 113 @Override 114 public boolean equals(final Object obj) { 115 if (obj != null && obj instanceof JMethod) { 116 JMethod other = (JMethod) obj; 117 118 // same name 119 if (!this.name.equals(other.name)) { 120 return false; 121 } 122 123 // same descriptor 124 if ((this.descriptor != null) && (!this.descriptor.equals(other.descriptor))) { 125 return false; 126 } 127 128 // Don't check signature (which include generics information) 129 // For example void method(List<Integer>) and 130 // void method(List<String>) 131 // and even if signature is different, they have same erasure 132 // This is not allowed, so don't need to check signature information. 133 134 135 // if all tests succeed, return true 136 return true; 137 } 138 return false; 139 } 140 141 /** 142 * a hash code value for the object. 143 * @return a hash code value for the object. 144 */ 145 @Override 146 public int hashCode() { 147 return name.hashCode(); 148 } 149 150 /** 151 * method descriptor. 152 * @return method descriptor 153 */ 154 public String getDescriptor() { 155 return descriptor; 156 } 157 158 /** 159 * method exceptions. 160 * @return method exceptions 161 */ 162 public String[] getExceptions() { 163 return exceptions; 164 } 165 166 /** 167 * method name. 168 * @return method name 169 */ 170 public String getName() { 171 return name; 172 } 173 174 /** 175 * method signature. 176 * method signature 177 * @return method signature 178 */ 179 public String getSignature() { 180 return signature; 181 } 182 183 /** 184 * string representation. 185 * @return string representation 186 */ 187 @Override 188 public String toString() { 189 StringBuilder sb = new StringBuilder(); 190 // classname 191 sb.append(this.getClass().getName().substring(this.getClass().getPackage().getName().length() + 1)); 192 193 // name 194 sb.append("[name="); 195 sb.append(name); 196 197 // access 198 sb.append(", access="); 199 sb.append(access); 200 201 // descriptor 202 if (descriptor != null) { 203 sb.append(", descriptor="); 204 sb.append(descriptor); 205 } 206 207 // signature 208 if (signature != null) { 209 sb.append(", signature="); 210 sb.append(signature); 211 } 212 213 // exceptions 214 if (exceptions != null) { 215 sb.append(", exceptions="); 216 sb.append(Arrays.asList(exceptions)); 217 } 218 sb.append("]"); 219 return sb.toString(); 220 } 221 }