码迷,mamicode.com
首页 > 编程语言 > 详细

获取java泛型参数类型

时间:2016-07-29 19:38:10      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:java


1、Type和Class的区别 

简单来说,Class实现了Type接口。

Type源码定义:

package java.lang.reflect;

/**
 * Type is the common superinterface for all types in the Java
 * programming language. These include raw types, parameterized types,
 * array types, type variables and primitive types.
 *
 * @since 1.5
 */

public interface Type {
}

Class实现了Type接口:

public final class Class<T> implements java.io.Serializable,
                              java.lang.reflect.GenericDeclaration,
                              java.lang.reflect.Type,
                              java.lang.reflect.AnnotatedElement {
}


类型的概念


“类型”刻划了一组值及其上可施行的操作,可理解为“值集”和“操作集”构成的二元组。


“类型的概念”与“值的概念”相对立,前者是程序中的概念,后者则是程序运行时的概念,两者通过“标识值”的语言成分(例如,变量、表达式等)联系起来。


比如变量v为具体类型T,类型T所刻划的值集为{v1,v2,…vn,…},则变量v运行时能取且只能取某个vi为值。由此可见,“类型”规定了具有该类型的变量或表达式的取值范围。


2、获取Java泛型参数类型

package com.rk.test;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.junit.Test;

public class ReflectTest
{
	@Test
	public void test()
	{
		Type type = Tiger.class.getGenericSuperclass();//com.rk.test.BaseAnimal<com.rk.test.Cat>
		ParameterizedType pt = (ParameterizedType) type;//com.rk.test.BaseAnimal<com.rk.test.Cat>
		Type[] types = pt.getActualTypeArguments();//[class com.rk.test.Cat]
		Type rawType = pt.getRawType();//class com.rk.test.BaseAnimal
		Type ownerType = pt.getOwnerType();//null
		Class clazz = (Class) types[0];//class com.rk.test.Cat
		String className = clazz.getName();//com.rk.test.Cat
		String simpleName = clazz.getSimpleName();//Cat
		System.out.println(className);
		System.out.println(simpleName);
	}
}

class BaseAnimal<T>
{
}

class Cat
{
}

class Tiger extends BaseAnimal<Cat>
{
}


3、ParameterizedType

package java.lang.reflect;


/**
 * ParameterizedType represents a parameterized type such as
 * Collection<String>.
 *
 * <p>Instances of classes that implement this interface must implement
 * an equals() method that equates any two instances that share the
 * same generic type declaration and have equal type parameters.
 *
 * @since 1.5
 */
public interface ParameterizedType extends Type {
    /**
     * Returns an array of {@code Type} objects representing the actual type
     * arguments to this type.
     *
     * <p>Note that in some cases, the returned array be empty. This can occur
     * if this type represents a non-parameterized type nested within
     * a parameterized type.
     *
     */
    Type[] getActualTypeArguments();

    /**
     * Returns the {@code Type} object representing the class or interface
     * that declared this type.
     */
    Type getRawType();

    /**
     * Returns a {@code Type} object representing the type that this type
     * is a member of.  For example, if this type is {@code O<T>.I<S>},
     * return a representation of {@code O<T>}.
     *
     * <p>If this type is a top-level type, {@code null} is returned.
     *
     */
    Type getOwnerType();
}







获取java泛型参数类型

标签:java

原文地址:http://lsieun.blog.51cto.com/9210464/1831630

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!