1d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee/**
2d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * Copyright (C) 2007 Google Inc.
3d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee *
4d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * Licensed under the Apache License, Version 2.0 (the "License");
5d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * you may not use this file except in compliance with the License.
6d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * You may obtain a copy of the License at
7d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee *
8d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * http://www.apache.org/licenses/LICENSE-2.0
9d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee *
10d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * Unless required by applicable law or agreed to in writing, software
11d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * distributed under the License is distributed on an "AS IS" BASIS,
12d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * See the License for the specific language governing permissions and
14d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * limitations under the License.
15d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee */
16d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee
179a227bef3b82a045323ef2cf38ec60b2e42cf0felimpbizkit@gmail.compackage com.google.inject.internal.util;
18d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee
19d9c913acca55023ef5d76a32c3d4a51ee6b420cbsberlinimport static com.google.common.base.Preconditions.checkNotNull;
20dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin
21dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlinimport java.lang.reflect.Constructor;
22dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlinimport java.lang.reflect.Field;
23dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlinimport java.lang.reflect.Member;
24dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlinimport java.lang.reflect.Method;
25d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazybobleeimport java.lang.reflect.Modifier;
26d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee
27d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee/**
28d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee * Class utilities.
29d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee */
309a227bef3b82a045323ef2cf38ec60b2e42cf0felimpbizkit@gmail.compublic final class Classes {
31d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee
32d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee  public static boolean isInnerClass(Class<?> clazz) {
33eb06177abdd178c9cc05312be7147e2ccc20becflimpbizkit    return !Modifier.isStatic(clazz.getModifiers())
34eb06177abdd178c9cc05312be7147e2ccc20becflimpbizkit        && clazz.getEnclosingClass() != null;
35d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee  }
36d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee
37d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee  public static boolean isConcrete(Class<?> clazz) {
38d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee    int modifiers = clazz.getModifiers();
39d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee    return !clazz.isInterface() && !Modifier.isAbstract(modifiers);
40d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee  }
41dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin
42dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin  /**
43dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin   * Formats a member as concise string, such as {@code java.util.ArrayList.size},
44dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin   * {@code java.util.ArrayList<init>()} or {@code java.util.List.remove()}.
45dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin   */
46dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin  public static String toString(Member member) {
47dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    Class<? extends Member> memberType = Classes.memberType(member);
48dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin
49dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    if (memberType == Method.class) {
50dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin      return member.getDeclaringClass().getName() + "." + member.getName() + "()";
51dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    } else if (memberType == Field.class) {
52dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin      return member.getDeclaringClass().getName() + "." + member.getName();
53dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    } else if (memberType == Constructor.class) {
54dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin      return member.getDeclaringClass().getName() + ".<init>()";
55dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    } else {
56dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin      throw new AssertionError();
57dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    }
58dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin  }
59dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin
60dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin  /**
61dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin   * Returns {@code Field.class}, {@code Method.class} or {@code Constructor.class}.
62dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin   */
63dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin  public static Class<? extends Member> memberType(Member member) {
64dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    checkNotNull(member, "member");
65dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin
66dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    if (member instanceof Field) {
67dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin      return Field.class;
68dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin
69dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    } else if (member instanceof Method) {
70dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin      return Method.class;
71dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin
72dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    } else if (member instanceof Constructor) {
73dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin      return Constructor.class;
74dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin
75dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    } else {
76dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin      throw new IllegalArgumentException(
77dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin          "Unsupported implementation class for Member, " + member.getClass());
78dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin    }
79dfee9fd5f78c5f1f769713b603e4e92a0b7b01e3sberlin  }
80d0c4b8bfd97912e9ba6a364e26abe54c52a89ba8crazyboblee}
81