Close

Java Reflection - Field.getGenericType() Examples

Java Reflection Java Java API 


Class:

java.lang.reflect.Field

java.lang.Objectjava.lang.Objectjava.lang.reflect.AccessibleObjectjava.lang.reflect.AccessibleObjectjava.lang.reflect.AnnotatedElementAnnotatedElementjava.lang.reflect.Fieldjava.lang.reflect.Fieldjava.lang.reflect.MemberMemberLogicBig

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());
}
}

Output

Example: 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);
}
}

Output

Example: 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);
}
}

Output

Example: 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);
}

}

Output

Example: 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);
}
}

Output

Example: 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);
}
}

Output

Example: 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




See Also