001 /*****************************************************************************
002 * Copyright (c) PicoContainer Organization. All rights reserved. *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file. *
007 * *
008 *****************************************************************************/
009 package org.picocontainer.injectors;
010
011 import org.picocontainer.NameBinding;
012
013 import java.lang.reflect.AccessibleObject;
014 import java.lang.reflect.Constructor;
015 import java.lang.reflect.Method;
016
017 import com.thoughtworks.paranamer.CachingParanamer;
018 import com.thoughtworks.paranamer.Paranamer;
019
020 public class ParameterNameBinding implements NameBinding {
021 private final Class impl;
022 private final AccessibleObject member;
023 private final int index;
024 private final CachingParanamer paranamer;
025
026 private String name;
027
028 public ParameterNameBinding(CachingParanamer paranamer, Class impl, AccessibleObject member, int index) {
029 this.impl = impl;
030 this.member = member;
031 this.paranamer = paranamer;
032 this.index = index;
033 }
034
035 public String getName() {
036 if (name != null) {
037 return name;
038 }
039 String[] strings = null;
040 if (paranamer.areParameterNamesAvailable(impl, "<init>") != Paranamer.PARAMETER_NAMES_FOUND) {
041 paranamer.switchtoAsm();
042 }
043 if (member instanceof Constructor) {
044 strings = paranamer.lookupParameterNames((Constructor)member);
045 } else {
046 strings = paranamer.lookupParameterNames((Method)member);
047 }
048 name = strings.length == 0 ? "" : strings[index];
049 return name;
050 }
051 }
052