1 package com.fasterxml.jackson.databind.introspect;
2
3 import java.lang.reflect.Constructor;
4 import java.lang.reflect.Method;
5
6 /**
7  * Helper class needed to be able to efficiently access class
8  * member functions ({@link Method}s and {@link Constructor}s)
9  * in {@link java.util.Map}s.
10  */

11 public final class MemberKey
12 {
13     final static Class<?>[] NO_CLASSES = new Class<?>[0];
14
15     final String _name;
16     final Class<?>[] _argTypes;
17
18     public MemberKey(Method m)
19     {
20         this(m.getName(), m.getParameterTypes());
21     }
22
23     public MemberKey(Constructor<?> ctor)
24     {
25         this("", ctor.getParameterTypes());
26     }
27
28     public MemberKey(String name, Class<?>[] argTypes)
29     {
30         _name = name;
31         _argTypes = (argTypes == null) ? NO_CLASSES : argTypes;
32     }
33
34     public String getName() {
35         return _name;
36     }
37
38     public int argCount() {
39         return _argTypes.length;
40     }
41
42     @Override
43     public String toString() {
44         return _name + "(" + _argTypes.length+"-args)";
45     }
46
47     @Override
48     public int hashCode() {
49         return _name.hashCode() + _argTypes.length;
50     }
51
52     @Override
53     public boolean equals(Object o)
54     {
55         if (o == thisreturn true;
56         if (o == nullreturn false;
57         if (o.getClass() != getClass()) {
58             return false;
59         }
60         MemberKey other = (MemberKey) o;
61         if (!_name.equals(other._name)) {
62             return false;
63         }
64         Class<?>[] otherArgs = other._argTypes;
65         int len = _argTypes.length;
66         if (otherArgs.length != len) {
67             return false;
68         }
69         for (int i = 0; i < len; ++i) {
70             Class<?> type1 = otherArgs[i];
71             Class<?> type2 = _argTypes[i];
72             if (type1 == type2) {
73                 continue;
74             }
75             /* 23-Feb-2009, tatu: Are there any cases where we would have to
76              *   consider some narrowing conversions or such? For now let's
77              *   assume exact type match is enough
78              */

79             /* 07-Apr-2009, tatu: Indeed there are (see [JACKSON-97]).
80              *    This happens with generics when a bound is specified.
81              *    I hope this works; check here must be transitive
82              */

83             /* 14-Oct-2014, tatu: No, doing that is wrong. Conflicts may (and will) be
84              *    handled at a later point; trying to change definition of equality
85              *    will just cause problems like [jackson-core#158]
86              */

87             /*
88             if (type1.isAssignableFrom(type2) || type2.isAssignableFrom(type1)) {
89                 continue;
90             }
91             */

92             return false;
93         }
94         return true;
95     }
96 }
97