Java Reflection Java Java API
Class:
java.lang.reflect.Field
Method:
public Type getGenericType()
Returns a
java.lang.reflect.Type
object that represents the type of this field. The returned type can be one of the implementations of Type's subinterfaces: GenericArrayType ,
ParameterizedType , WildcardType , TypeVariable ,
Class .
Examples
Simple Class type package com.logicbig.example.field;
import java.lang.reflect.Field; import java.lang.reflect.Type; import java.math.BigDecimal;
public class GetGenericTypeExample { private int anInt; private BigDecimal bigNumber;
public static void main(String... args) throws NoSuchFieldException { Field field = GetGenericTypeExample.class.getDeclaredField("anInt"); Type type = field.getGenericType(); printType(field, type);
Field field2 = GetGenericTypeExample.class.getDeclaredField("bigNumber"); Type type2 = field2.getGenericType(); printType(field2, type2); }
private static void printType(Field field, Type type) { System.out.printf("Example: %s %s;%n", field.getType().getSimpleName(), field.getName()); System.out.println("Type class= " + type.getClass()); System.out.println("Type name= " + type.getTypeName()); } }
OutputExample: int anInt; Type class= class java.lang.Class Type name= int Example: BigDecimal bigNumber; Type class= class java.lang.Class Type name= java.math.BigDecimal
Array Type package com.logicbig.example.field;
import java.lang.reflect.Field; import java.lang.reflect.Type; import java.math.BigDecimal;
public class GetGenericTypeExample2 { private int numbers[]; private BigDecimal[] bigNumbers; private BigDecimal[][] bigNumbersOfNumbers;
public static void main(String... args) throws NoSuchFieldException { Field field = GetGenericTypeExample2.class.getDeclaredField("numbers"); Type type = field.getGenericType(); printType(field, type);
Field field2 = GetGenericTypeExample2.class.getDeclaredField("bigNumbers"); Type type2 = field2.getGenericType(); printType(field2, type2);
Field field3 = GetGenericTypeExample2.class.getDeclaredField("bigNumbersOfNumbers"); Type type3 = field3.getGenericType(); printType(field3, type3); }
private static void printType(Field field, Type type) { System.out.printf("Example: %s %s;%n", field.getType().getSimpleName(), field.getName()); print(1, "Type class= " + type.getClass()); print(1, "Type name= " + type.getTypeName()); printArrayComponentType(type, 1); }
private static void printArrayComponentType(Type type, int level) { if (type instanceof Class && ((Class) type).isArray()) { Class componentType = ((Class) type).getComponentType(); print(level, "Array component type=" + componentType.getTypeName()); printArrayComponentType(componentType, level + 1); } }
private static void print(int level, String string) { System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string); } }
OutputExample: int[] numbers; ¦- Type class= class java.lang.Class ¦- Type name= int[] ¦- Array component type=int Example: BigDecimal[] bigNumbers; ¦- Type class= class java.lang.Class ¦- Type name= java.math.BigDecimal[] ¦- Array component type=java.math.BigDecimal Example: BigDecimal[][] bigNumbersOfNumbers; ¦- Type class= class java.lang.Class ¦- Type name= java.math.BigDecimal[][] ¦- Array component type=java.math.BigDecimal[] ¦- Array component type=java.math.BigDecimal
Type involving Generics (ParameterizedType) package com.logicbig.example.field;
import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Arrays; import java.util.List; import java.util.Map;
public class GetGenericTypeExample3 { private List<String> aList; private Map<String, List<String>> aMap;
public static void main(String... args) throws NoSuchFieldException { System.out.println("Example: List<String> aList;"); Field field = GetGenericTypeExample3.class.getDeclaredField("aList"); Type type = field.getGenericType(); printType(type, 1);
System.out.println("Example: Map<String, List<String>> aMap;"); Field field2 = GetGenericTypeExample3.class.getDeclaredField("aMap"); Type type2 = field2.getGenericType(); printType(type2, 1); }
private static void printType(Type type, int level) { if (type == null) { print(level, "The Type is null"); return; } print(level, "Type class=" + type.getClass()); if (type.getClass() != Class.class) { print(level, "Type class implementing interfaces=" + Arrays.toString(type.getClass().getInterfaces())); } print(level, "Type name= " + type.getTypeName()); printParameterizedType(type, level); }
private static void printParameterizedType(Type type, int level) { if (type instanceof ParameterizedType) { print(level, "Casting to ParameterizedType"); ParameterizedType pt = (ParameterizedType) type; print(level, "Using ParameterizedType#getOwnerType()"); Type ownerType = pt.getOwnerType(); printType(ownerType, level + 1);
print(level, "Using ParameterizedType#getRawType()"); Type rawType = pt.getRawType(); printType(rawType, level + 1);
print(level, "Using ParameterizedType#getActualTypeArguments()"); for (Type actualType : pt.getActualTypeArguments()) { print(level, "ActualTypeArgument loop"); printType(actualType, level + 1); } } }
private static void print(int level, String string) { System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string); } }
OutputExample: List<String> aList; ¦- Type class=class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.ParameterizedType] ¦- Type name= java.util.List<java.lang.String> ¦- Casting to ParameterizedType ¦- Using ParameterizedType#getOwnerType() ¦- The Type is null ¦- Using ParameterizedType#getRawType() ¦- Type class=class java.lang.Class ¦- Type name= java.util.List ¦- Using ParameterizedType#getActualTypeArguments() ¦- ActualTypeArgument loop ¦- Type class=class java.lang.Class ¦- Type name= java.lang.String Example: Map<String, List<String>> aMap; ¦- Type class=class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.ParameterizedType] ¦- Type name= java.util.Map<java.lang.String, java.util.List<java.lang.String>> ¦- Casting to ParameterizedType ¦- Using ParameterizedType#getOwnerType() ¦- The Type is null ¦- Using ParameterizedType#getRawType() ¦- Type class=class java.lang.Class ¦- Type name= java.util.Map ¦- Using ParameterizedType#getActualTypeArguments() ¦- ActualTypeArgument loop ¦- Type class=class java.lang.Class ¦- Type name= java.lang.String ¦- ActualTypeArgument loop ¦- Type class=class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.ParameterizedType] ¦- Type name= java.util.List<java.lang.String> ¦- Casting to ParameterizedType ¦- Using ParameterizedType#getOwnerType() ¦- The Type is null ¦- Using ParameterizedType#getRawType() ¦- Type class=class java.lang.Class ¦- Type name= java.util.List ¦- Using ParameterizedType#getActualTypeArguments() ¦- ActualTypeArgument loop ¦- Type class=class java.lang.Class ¦- Type name= java.lang.String
Generic Variable Type (TypeVariable) package com.logicbig.example.field;
import java.lang.reflect.*; import java.util.Arrays; import java.util.List;
public class GetGenericTypeExample4<T> { private T t; private List<T> list;
public static void main(String... args) throws NoSuchFieldException { System.out.println("Example: T t;"); Field field = GetGenericTypeExample4.class.getDeclaredField("t"); Type genericType = field.getGenericType(); printType(genericType, 1);
System.out.println("Example: List<T> list;"); Field field2 = GetGenericTypeExample4.class.getDeclaredField("list"); Type genericType2 = field2.getGenericType(); printType(genericType2, 1); }
private static void printType(Type type, int level) { if (type == null) { print(level, "The Type is null"); return; } print(level, "Type class=" + type.getClass()); if (type.getClass() != Class.class) { print(level, "Type class implementing interfaces=" + Arrays.toString(type.getClass().getInterfaces())); } print(level, "Type name= " + type.getTypeName()); printTypeVariable(type, level); printParameterizedType(type, level); }
private static void printTypeVariable(Type type, int level) { if (type instanceof TypeVariable) { print(level, "Casting to TypeVariable"); TypeVariable typeVariable = (TypeVariable) type; print(level, "TypeVariable#getName()= " + typeVariable.getName()); GenericDeclaration genericDeclaration = typeVariable.getGenericDeclaration(); print(level, "TypeVariable#getGenericDeclaration()= " + genericDeclaration); printGenericDeclaration(level, genericDeclaration); } }
private static void printGenericDeclaration(int level, GenericDeclaration genericDeclaration) { print(level, "GenericDeclaration#getTypeParameters()= " + Arrays.toString(genericDeclaration.getTypeParameters())); }
private static void printParameterizedType(Type type, int level) { if (type instanceof ParameterizedType) { print(level, "Casting to ParameterizedType"); ParameterizedType pt = (ParameterizedType) type; print(level, "Using ParameterizedType#getOwnerType()"); Type ownerType = pt.getOwnerType(); printType(ownerType, level + 1);
print(level, "Using ParameterizedType#getRawType()"); Type rawType = pt.getRawType(); printType(rawType, level + 1);
print(level, "Using ParameterizedType#getActualTypeArguments()"); for (Type actualType : pt.getActualTypeArguments()) { print(level, "ActualTypeArgument loop"); printType(actualType, level + 1); } } }
private static void print(int level, String string) { System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string); }
}
OutputExample: T t; ¦- Type class=class sun.reflect.generics.reflectiveObjects.TypeVariableImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.TypeVariable] ¦- Type name= T ¦- Casting to TypeVariable ¦- TypeVariable#getName()= T ¦- TypeVariable#getGenericDeclaration()= class com.logicbig.example.field.GetGenericTypeExample4 ¦- GenericDeclaration#getTypeParameters()= [T] Example: List<T> list; ¦- Type class=class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.ParameterizedType] ¦- Type name= java.util.List<T> ¦- Casting to ParameterizedType ¦- Using ParameterizedType#getOwnerType() ¦- The Type is null ¦- Using ParameterizedType#getRawType() ¦- Type class=class java.lang.Class ¦- Type name= java.util.List ¦- Using ParameterizedType#getActualTypeArguments() ¦- ActualTypeArgument loop ¦- Type class=class sun.reflect.generics.reflectiveObjects.TypeVariableImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.TypeVariable] ¦- Type name= T ¦- Casting to TypeVariable ¦- TypeVariable#getName()= T ¦- TypeVariable#getGenericDeclaration()= class com.logicbig.example.field.GetGenericTypeExample4 ¦- GenericDeclaration#getTypeParameters()= [T]
Generic Array Type package com.logicbig.example.field;
import java.lang.reflect.*; import java.util.Arrays; import java.util.List;
public class GetGenericTypeExample5<T> { private T[] ts; private List<T[]> tsList;
public static void main(String... args) throws NoSuchFieldException { System.out.println("Example: T[] ts;"); Field field = GetGenericTypeExample5.class.getDeclaredField("ts"); Type genericType = field.getGenericType(); printType(genericType, 1);
System.out.println("Example: List<T[]> tsList;"); Field field2 = GetGenericTypeExample5.class.getDeclaredField("tsList"); Type genericType2 = field2.getGenericType(); printType(genericType2, 1); }
private static void printType(Type type, int level) { if (type == null) { print(level, "The Type is null"); return; } print(level, "Type class=" + type.getClass()); if (type.getClass() != Class.class) { print(level, "Type class implementing interfaces=" + Arrays.toString(type.getClass().getInterfaces())); } print(level, "Type name= " + type.getTypeName()); printTypeVariable(type, level); printParameterizedType(type, level); printGenericArrayType(type, level); }
private static void printGenericArrayType(Type type, int level) { if(type instanceof GenericArrayType){ print(level, "Casting to GenericArrayType"); GenericArrayType genericArrayType = (GenericArrayType) type; print(level, "Using GenericArrayType#getGenericComponentType()" ); Type genericComponentType = genericArrayType.getGenericComponentType(); printType( genericComponentType, level+1); } }
private static void printTypeVariable(Type type, int level) { if (type instanceof TypeVariable) { print(level, "Casting to TypeVariable"); TypeVariable typeVariable = (TypeVariable) type; print(level, "TypeVariable#getName()= " + typeVariable.getName()); GenericDeclaration genericDeclaration = typeVariable.getGenericDeclaration(); print(level, "TypeVariable#getGenericDeclaration()= " + genericDeclaration); printGenericDeclaration(level, genericDeclaration); } }
private static void printGenericDeclaration(int level, GenericDeclaration genericDeclaration) { print(level, "GenericDeclaration#getTypeParameters()= " + Arrays.toString(genericDeclaration.getTypeParameters())); }
private static void printParameterizedType(Type type, int level) { if (type instanceof ParameterizedType) { print(level, "Casting to ParameterizedType"); ParameterizedType pt = (ParameterizedType) type; print(level, "Using ParameterizedType#getOwnerType()"); Type ownerType = pt.getOwnerType(); printType(ownerType, level + 1);
print(level, "Using ParameterizedType#getRawType()"); Type rawType = pt.getRawType(); printType(rawType, level + 1);
print(level, "Using ParameterizedType#getActualTypeArguments()"); for (Type actualType : pt.getActualTypeArguments()) { print(level, "ActualTypeArgument loop"); printType(actualType, level + 1); } } }
private static void print(int level, String string) { System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string); } }
OutputExample: T[] ts; ¦- Type class=class sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.GenericArrayType] ¦- Type name= T[] ¦- Casting to GenericArrayType ¦- Using GenericArrayType#getGenericComponentType() ¦- Type class=class sun.reflect.generics.reflectiveObjects.TypeVariableImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.TypeVariable] ¦- Type name= T ¦- Casting to TypeVariable ¦- TypeVariable#getName()= T ¦- TypeVariable#getGenericDeclaration()= class com.logicbig.example.field.GetGenericTypeExample5 ¦- GenericDeclaration#getTypeParameters()= [T] Example: List<T[]> tsList; ¦- Type class=class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.ParameterizedType] ¦- Type name= java.util.List<T[]> ¦- Casting to ParameterizedType ¦- Using ParameterizedType#getOwnerType() ¦- The Type is null ¦- Using ParameterizedType#getRawType() ¦- Type class=class java.lang.Class ¦- Type name= java.util.List ¦- Using ParameterizedType#getActualTypeArguments() ¦- ActualTypeArgument loop ¦- Type class=class sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.GenericArrayType] ¦- Type name= T[] ¦- Casting to GenericArrayType ¦- Using GenericArrayType#getGenericComponentType() ¦- Type class=class sun.reflect.generics.reflectiveObjects.TypeVariableImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.TypeVariable] ¦- Type name= T ¦- Casting to TypeVariable ¦- TypeVariable#getName()= T ¦- TypeVariable#getGenericDeclaration()= class com.logicbig.example.field.GetGenericTypeExample5 ¦- GenericDeclaration#getTypeParameters()= [T]
Type involving Wildcard generic (WildcardType) package com.logicbig.example.field;
import javax.swing.*; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.WildcardType; import java.util.Arrays; import java.util.List; import java.util.Map;
public class GetGenericTypeExample6 { private List<?> list; private Map<? extends Number, ? super JFormattedTextField> map;
public static void main(String... args) throws NoSuchFieldException { System.out.println("Example: List<?> list;"); Field field = GetGenericTypeExample6.class.getDeclaredField("list"); Type genericType = field.getGenericType(); printType(genericType, 1);
System.out.println("Example: Map<? extends Number, ? super JFormattedTextField> map"); Field field2 = GetGenericTypeExample6.class.getDeclaredField("map"); Type genericType2 = field2.getGenericType(); printType(genericType2, 1); }
private static void printType(Type type, int level) { if (type == null) { print(level, "The Type is null"); return; } print(level, "Type class=" + type.getClass()); if (type.getClass() != Class.class) { print(level, "Type class implementing interfaces=" + Arrays.toString(type.getClass().getInterfaces())); } print(level, "Type name= " + type.getTypeName()); printWildcardType(type, level); printParameterizedType(type, level); }
private static void printParameterizedType(Type type, int level) { if (type instanceof ParameterizedType) { print(level, "Casting to ParameterizedType"); ParameterizedType pt = (ParameterizedType) type; print(level, "Using ParameterizedType#getOwnerType()"); Type ownerType = pt.getOwnerType(); printType(ownerType, level + 1);
print(level, "Using ParameterizedType#getRawType()"); Type rawType = pt.getRawType(); printType(rawType, level + 1);
print(level, "Using ParameterizedType#getActualTypeArguments()"); for (Type actualType : pt.getActualTypeArguments()) { print(level, "ActualTypeArgument loop"); printType(actualType, level + 1); } } }
private static void printWildcardType(Type type, int level) { if (type instanceof WildcardType) { print(level, "Casting to WildcardType"); WildcardType wildcardType = (WildcardType) type; print(level, "Using WildcardType#getLowerBounds()"); if (wildcardType.getLowerBounds().length > 0) { for (Type lowerBoundType : wildcardType.getLowerBounds()) { print(level, "lowerBoundType loop"); printType(lowerBoundType, level + 1); } } else { print(level, "No lowerBoundType found"); } if (wildcardType.getUpperBounds().length > 0) { print(level, "Using WildcardType#getUpperBounds()"); for (Type upperBoundType : wildcardType.getUpperBounds()) { print(level, "upperBoundType loop"); printType(upperBoundType, level + 1); } } else { print(level, "No upperBoundType found"); } } }
private static void print(int level, String string) { System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string); } }
OutputExample: List<?> list; ¦- Type class=class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.ParameterizedType] ¦- Type name= java.util.List<?> ¦- Casting to ParameterizedType ¦- Using ParameterizedType#getOwnerType() ¦- The Type is null ¦- Using ParameterizedType#getRawType() ¦- Type class=class java.lang.Class ¦- Type name= java.util.List ¦- Using ParameterizedType#getActualTypeArguments() ¦- ActualTypeArgument loop ¦- Type class=class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.WildcardType] ¦- Type name= ? ¦- Casting to WildcardType ¦- Using WildcardType#getLowerBounds() ¦- No lowerBoundType found ¦- Using WildcardType#getUpperBounds() ¦- upperBoundType loop ¦- Type class=class java.lang.Class ¦- Type name= java.lang.Object Example: Map<? extends Number, ? super JFormattedTextField> map ¦- Type class=class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.ParameterizedType] ¦- Type name= java.util.Map<? extends java.lang.Number, ? super javax.swing.JFormattedTextField> ¦- Casting to ParameterizedType ¦- Using ParameterizedType#getOwnerType() ¦- The Type is null ¦- Using ParameterizedType#getRawType() ¦- Type class=class java.lang.Class ¦- Type name= java.util.Map ¦- Using ParameterizedType#getActualTypeArguments() ¦- ActualTypeArgument loop ¦- Type class=class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.WildcardType] ¦- Type name= ? extends java.lang.Number ¦- Casting to WildcardType ¦- Using WildcardType#getLowerBounds() ¦- No lowerBoundType found ¦- Using WildcardType#getUpperBounds() ¦- upperBoundType loop ¦- Type class=class java.lang.Class ¦- Type name= java.lang.Number ¦- ActualTypeArgument loop ¦- Type class=class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl ¦- Type class implementing interfaces=[interface java.lang.reflect.WildcardType] ¦- Type name= ? super javax.swing.JFormattedTextField ¦- Casting to WildcardType ¦- Using WildcardType#getLowerBounds() ¦- lowerBoundType loop ¦- Type class=class java.lang.Class ¦- Type name= javax.swing.JFormattedTextField ¦- Using WildcardType#getUpperBounds() ¦- upperBoundType loop ¦- Type class=class java.lang.Class ¦- Type name= java.lang.Object
|
|