package net.ion.bleujin;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
/**
* Basically the same answer as noah's.
*/
public class TestGeneric<E> {
@SuppressWarnings("unchecked")
public Class<E> getTypeParameterClass() {
Type type = getClass().getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) type;
return (Class<E>) paramType.getActualTypeArguments()[0];
}
private static class StringHome extends TestGeneric<String> {
}
private static class StringBuilderHome extends TestGeneric<StringBuilder> {
}
private static class StringBufferHome extends TestGeneric<StringBuffer> {
}
/**
* This prints "String", "StringBuilder" and "StringBuffer"
*/
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
String object0 = new StringHome().getTypeParameterClass().newInstance();
StringBuilder object1 = new StringBuilderHome().getTypeParameterClass().newInstance();
StringBuffer object2 = new StringBufferHome().getTypeParameterClass().newInstance();
System.out.println(object0.getClass().getSimpleName());
System.out.println(object1.getClass().getSimpleName());
System.out.println(object2.getClass().getSimpleName());
}
}