您的位置:首页 > 其它

T和Class<T>以及Class<?>的理解

2017-11-27 23:19 85 查看
T  bean ;

Class<T> bean;

Class<?> bean;

在利用反射获取属性时,遇到这样的写法,对此专门查些资料研究了一下。

单独的T 代表一个类型 而 Class<T>和Class<?>代表这个类型所对应的类

Class<T>在实例化的时候,T要替换成具体类

Class<?>它是个通配泛型,?可以代表任何类型   


<? extends T>受限统配,表示T的一个未知子类。

<? super T>下限统配,表示T的一个未知父类。

public T find(Class<T> clazz, int id);
根据类来反射生成一个实例,而单独用T没法做到。

Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。getClass() 会看到返回Class<?>。

JDK中,普通的Class.newInstance()方法的定义返回Object,要将该返回类型强制转换为另一种类型;

但是使用泛型的Class<T>,Class.newInstance()方法具有一个特定的返回类型;

 DefaultListableBeanFactory.java   doResolveDependency 

protected Object doResolveDependency(DependencyDescriptor descriptor, Class<?> type, String beanName,  

            Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException {  

  

        Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);  

        if (value != null) {  

            if (value instanceof String) {  

                String strVal = resolveEmbeddedValue((String) value);  

                BeanDefinition bd = (beanName != null && containsBean(beanName) ? getMergedBeanDefinition(beanName) : null);  

                value = evaluateBeanDefinitionString(strVal, bd);  

            }  

            TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());  

            return (descriptor.getField() != null ?  

                    converter.convertIfNecessary(value, type, descriptor.getField()) :  

                    converter.convertIfNecessary(value, type, descriptor.getMethodParameter()));  

        }  

  

        if (type.isArray()) {  

            Class<?> componentType = type.getComponentType();  

            Map<String, Object> matchingBeans = findAutowireCandidates(beanName, componentType, descriptor);  

            if (matchingBeans.isEmpty()) {  

                if (descriptor.isRequired()) {  

                    raiseNoSuchBeanDefinitionException(componentType, "array of " + componentType.getName(), descriptor);  

                }  

                return null;  

            }  

            if (autowiredBeanNames != null) {  

                autowiredBeanNames.addAll(matchingBeans.keySet());  

            }  

            TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());  

            return converter.convertIfNecessary(matchingBeans.values(), type);  

        }  

        else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {  

            Class<?> elementType = descriptor.getCollectionType();  

            if (elementType == null) {  

                if (descriptor.isRequired()) {  

                    throw new FatalBeanException("No element type declared for collection [" + type.getName() + "]");  

                }  

                return null;  

            }  

            Map<String, Object> matchingBeans = findAutowireCandidates(beanName, elementType, descriptor);  

            if (matchingBeans.isEmpty()) {  

                if (descriptor.isRequired()) {  

                    raiseNoSuchBeanDefinitionException(elementType, "collection of " + elementType.getName(), descriptor);  

                }  

                return null;  

            }  

            if (autowiredBeanNames != null) {  

                autowiredBeanNames.addAll(matchingBeans.keySet());  

            }  

            TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());  

            return converter.convertIfNecessary(matchingBeans.values(), type);  

        }  

        else if (Map.class.isAssignableFrom(type) && type.isInterface()) {  

            Class<?> keyType = descriptor.getMapKeyType();  

            if (keyType == null || !String.class.isAssignableFrom(keyType)) {  

                if (descriptor.isRequired()) {  

                    throw new FatalBeanException("Key type [" + keyType + "] of map [" + type.getName() +  

                            "] must be assignable to [java.lang.String]");  

                }  

                return null;  

            }  

            Class<?> valueType = descriptor.getMapValueType();  

            if (valueType == null) {  

                if (descriptor.isRequired()) {  

                    throw new FatalBeanException("No value type declared for map [" + type.getName() + "]");  

                }  

                return null;  

            }  

            Map<String, Object> matchingBeans = findAutowireCandidates(beanName, valueType, descriptor);  

            if (matchingBeans.isEmpty()) {  

                if (descriptor.isRequired()) {  

                    raiseNoSuchBeanDefinitionException(valueType, "map with value type " + valueType.getName(), descriptor);  

                }  

                return null;  

            }  

            if (autowiredBeanNames != null) {  

                autowiredBeanNames.addAll(matchingBeans.keySet());  

            }  

            return matchingBeans;  

        }  

        else {  

            Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);  

            if (matchingBeans.isEmpty()) {  

                if (descriptor.isRequired()) {  

                    raiseNoSuchBeanDefinitionException(type, "", descriptor);  

                }  

                return null;  

            }  

            if (matchingBeans.size() > 1) {  

                String primaryBeanName = determinePrimaryCandidate(matchingBeans, descriptor);  

                if (primaryBeanName == null) {  

                    throw new NoUniqueBeanDefinitionException(type, matchingBeans.keySet());  

                }  

                if (autowiredBeanNames != null) {  

                    autowiredBeanNames.add(primaryBeanName);  

                }  

                return matchingBeans.get(primaryBeanName);  

            }  

            // We have exactly one match.  

            Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();  

            if (autowiredBeanNames != null) {  

                autowiredBeanNames.add(entry.getKey());  

            }  

            return entry.getValue();  

        }  

    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: