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