package org.jboss.resteasy.util;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.jboss.resteasy.resteasy_jaxrs.i18n.Messages;
/**
* This class is a trick used to extract GenericType information at runtime. Java does not allow you get generic
* type information easily, so this class does the trick. For example:
* <p/>
* <pre>
* Type genericType = (new GenericType<List<String>>() {}).getGenericType();
* </pre>
* <p/>
* The above code will get you the genericType for List<String>
*
* N.B. This class is replaced by javax.ws.rs.core.GenericType.
*
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*
* @deprecated Replaced by javax.ws.rs.core.GenericType
*
* @see javax.ws.rs.core.GenericType
*/
@Deprecated
public class GenericType<T>
{
final Class<T> type;
final Type genericType;
/**
* Constructs a new generic entity. Derives represented class from type
* parameter. Note that this constructor is protected, users should create
* a (usually anonymous) subclass as shown above.
*
* @param entity the entity instance, must not be null
* @throws IllegalArgumentException if entity is null
*/
protected GenericType()
{
Type superclass = getClass().getGenericSuperclass();
if (!(superclass instanceof ParameterizedType))
{
throw new RuntimeException(Messages.MESSAGES.missingTypeParameter());
}
ParameterizedType parameterized = (ParameterizedType) superclass;
this.genericType = parameterized.getActualTypeArguments()[0];
this.type = (Class<T>) Types.getRawType(genericType);
}
/**
* Gets the raw type of the enclosed entity. Note that this is the raw type of
* the instance, not the raw type of the type parameter. I.e. in the example
* in the introduction, the raw type is {@code ArrayList} not {@code List}.
*
* @return the raw type
*/
public final Class<T> getType()
{
return type;
}
/**
* Gets underlying {@code Type} instance. Note that this is derived from the
* type parameter, not the enclosed instance. I.e. in the example
* in the introduction, the type is {@code List<String>} not
* {@code ArrayList<String>}.
*
* @return the type
*/
public final Type getGenericType()
{
return genericType;
}
}