Close

Java Reflection - Method.getGenericReturnType() Examples

Java Reflection Java Java API 


Class:

java.lang.reflect.Method

java.lang.Objectjava.lang.Objectjava.lang.reflect.AccessibleObjectjava.lang.reflect.AccessibleObjectjava.lang.reflect.AnnotatedElementAnnotatedElementjava.lang.reflect.Executablejava.lang.reflect.Executablejava.lang.reflect.MemberMemberjava.lang.reflect.GenericDeclarationGenericDeclarationjava.lang.reflect.Methodjava.lang.reflect.MethodLogicBig

Method:

public Type getGenericReturnType()

Returns a Type object that represents the formal return type of the method represented by this Method object.


Examples


package com.logicbig.example.method;

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Arrays;
import java.util.Objects;

public class GetGenericReturnTypeExample<N extends Number> {

public N process() {return null;}

public static void main(String... args) throws NoSuchMethodException {
Method m = GetGenericReturnTypeExample.class.getDeclaredMethod("process");
Type t = m.getGenericReturnType();
printType(t, 1);
}

private static void printType(Type type, int level) {
if (type == null) {
return;
}
print(level, "type: " + Objects.toString(type));
if (type instanceof TypeVariable) {
print(level, "type is an instance of TypeVariable");
printTypeVariable((TypeVariable) type, level + 1);
} else if (type instanceof Class) {
print(level, "type is an instance of Class");
print(level, "Class Name: " + ((Class) type).getName());
} else {
throw new RuntimeException();
}
}

private static void printTypeVariable(TypeVariable type, int level) {
print(level, "TypeVariable#getName(): " + type.getName());
Type[] bounds = type.getBounds();
print(level, "TypeVariable#getBounds(): " + Arrays.toString(bounds));
for (Type bound : bounds) {
print(level, "TypeVariable#bound: " + bound);
printType(bound, level + 1);
}
}

private static void print(int level, String string) {
System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string);
}
}

Output

 ¦- type: N
¦- type is an instance of TypeVariable
¦- TypeVariable#getName(): N
¦- TypeVariable#getBounds(): [class java.lang.Number]
¦- TypeVariable#bound: class java.lang.Number
¦- type: class java.lang.Number
¦- type is an instance of Class
¦- Class Name: java.lang.Number




package com.logicbig.example.method;

import java.lang.reflect.*;
import java.util.Arrays;
import java.util.Objects;

public class GetGenericReturnTypeExample2<N extends Number> {

public N[] process() {return null;}

public static void main(String... args) throws NoSuchMethodException {
Method m = GetGenericReturnTypeExample2.class.getDeclaredMethod("process");
Type type = m.getGenericReturnType();
printType(type, 1);
}

private static void printType(Type type, int level) {
if (type == null) {
return;
}
print(level, "type: " + Objects.toString(type));
if (type instanceof TypeVariable) {
print(level, "type is an instance of TypeVariable");
printTypeVariable((TypeVariable) type, level + 1);
} else if (type instanceof Class) {
print(level, "type is an instance of Class");
print(level, "Class Name: " + ((Class) type).getName());
} else if (type instanceof GenericArrayType) {
print(level, "type is an instance of GenericArrayType");
printGenericArrayType((GenericArrayType) type, level + 1);
} else {
throw new RuntimeException();
}
}

private static void printGenericArrayType(GenericArrayType type, int level) {
Type componentType = type.getGenericComponentType();
print(level, "GenericArrayType#getGenericComponentType(): " + componentType);
printType(componentType, level + 1);
}

private static void printTypeVariable(TypeVariable type, int level) {
print(level, "TypeVariable#getName(): " + type.getName());
Type[] bounds = type.getBounds();
print(level, "TypeVariable#getBounds(): " + Arrays.toString(bounds));
for (Type bound : bounds) {
print(level, "TypeVariable#bound: " + bound);
printType(bound, level + 1);
}
}

private static void print(int level, String string) {
System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string);
}
}

Output

 ¦- type: N[]
¦- type is an instance of GenericArrayType
¦- GenericArrayType#getGenericComponentType(): N
¦- type: N
¦- type is an instance of TypeVariable
¦- TypeVariable#getName(): N
¦- TypeVariable#getBounds(): [class java.lang.Number]
¦- TypeVariable#bound: class java.lang.Number
¦- type: class java.lang.Number
¦- type is an instance of Class
¦- Class Name: java.lang.Number




package com.logicbig.example.method;

import java.lang.reflect.*;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class GetGenericReturnTypeExample3<N extends Number> {

public List<N> process() {return null;}

public static void main(String... args) throws NoSuchMethodException {
Method m = GetGenericReturnTypeExample3.class.getDeclaredMethod("process");
Type type = m.getGenericReturnType();
printType(type, 1);
}

private static void printType(Type type, int level) {
if (type == null) {
return;
}
print(level, "type: " + Objects.toString(type));
if (type instanceof TypeVariable) {
print(level, "type is an instance of TypeVariable");
printTypeVariable((TypeVariable) type, level + 1);
} else if (type instanceof Class) {
print(level, "type is an instance of Class");
print(level, "Class Name: " + ((Class) type).getName());
} else if (type instanceof ParameterizedType) {
print(level, "type is an instance of ParameterizedType");
printParameterizeType((ParameterizedType) type, level + 1);
} else {
throw new RuntimeException();
}
}

private static void printParameterizeType(ParameterizedType type, int level) {
Type ownerType = type.getOwnerType();
print(level, "ParameterizedType#getOwnerType(): " + ownerType);
printType(ownerType, level + 1);
Type rawType = type.getRawType();
print(level, "ParameterizedType#getRawType(): " + rawType);
printType(rawType, level + 1);
Type[] types = type.getActualTypeArguments();
print(level, "ParameterizedType#getActualTypeArguments(): " + Arrays.toString(types));
for (Type type1 : types) {
print(level, "ParameterizedType#actualTypeArgument: " + type1);
printType(type1, level + 1);
}
}

private static void printTypeVariable(TypeVariable type, int level) {
print(level, "TypeVariable#getName(): " + type.getName());
Type[] bounds = type.getBounds();
print(level, "TypeVariable#getBounds(): " + Arrays.toString(bounds));
for (Type bound : bounds) {
print(level, "TypeVariable#bound: " + bound);
printType(bound, level + 1);
}
}

private static void print(int level, String string) {
System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string);
}
}

Output

 ¦- type: java.util.List<N>
¦- type is an instance of ParameterizedType
¦- ParameterizedType#getOwnerType(): null
¦- ParameterizedType#getRawType(): interface java.util.List
¦- type: interface java.util.List
¦- type is an instance of Class
¦- Class Name: java.util.List
¦- ParameterizedType#getActualTypeArguments(): [N]
¦- ParameterizedType#actualTypeArgument: N
¦- type: N
¦- type is an instance of TypeVariable
¦- TypeVariable#getName(): N
¦- TypeVariable#getBounds(): [class java.lang.Number]
¦- TypeVariable#bound: class java.lang.Number
¦- type: class java.lang.Number
¦- type is an instance of Class
¦- Class Name: java.lang.Number




package com.logicbig.example.method;

import javax.swing.*;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.WildcardType;
import java.util.Arrays;
import java.util.Map;
import java.util.Objects;

public class GetGenericReturnTypeExample4 {
Map<? extends Number, ? super JFormattedTextField> process() {return null;}

public static void main(String... args) throws NoSuchMethodException {
Method m = GetGenericReturnTypeExample4.class.getDeclaredMethod("process");
Type type = m.getGenericReturnType();
printType(type, 1);
}

private static void printType(Type type, int level) {
if (type == null) {
return;
}
print(level, "type: " + Objects.toString(type));
if (type instanceof Class) {
print(level, "type is an instance of Class");
print(level, "Class Name: " + ((Class) type).getName());
} else if (type instanceof ParameterizedType) {
print(level, "type is an instance of ParameterizedType");
printParameterizeType((ParameterizedType) type, level + 1);
} else if (type instanceof WildcardType) {
print(level, "type is an instance of WildcardType");
printWildcardType((WildcardType) type, level + 1);
} else {
throw new RuntimeException();
}
}

private static void printWildcardType(WildcardType type, int level) {
Type[] lowerBounds = type.getLowerBounds();
print(level, "WildcardType#getLowerBounds(): " + Arrays.toString(lowerBounds));
for (Type lowerBound : lowerBounds) {
print(level, "WildcardType#lowerBound: " + lowerBound);
printType(lowerBound, level + 1);
}
Type[] upperBounds = type.getUpperBounds();
print(level, "WildcardType#getUpperBounds(): " + Arrays.toString(upperBounds));
for (Type upperBound : upperBounds) {
print(level, "WildcardType#upperBound: " + upperBound);
printType(upperBound, level + 1);
}
}

private static void printParameterizeType(ParameterizedType type, int level) {
Type ownerType = type.getOwnerType();
print(level, "ParameterizedType#getOwnerType(): " + ownerType);
printType(ownerType, level + 1);
Type rawType = type.getRawType();
print(level, "ParameterizedType#getRawType(): " + rawType);
printType(rawType, level + 1);
Type[] types = type.getActualTypeArguments();
print(level, "ParameterizedType#getActualTypeArguments(): " + Arrays.toString(types));
for (Type type1 : types) {
print(level, "ParameterizedType#actualTypeArgument: " + type1);
printType(type1, level + 1);
}
}

private static void print(int level, String string) {
System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string);
}
}

Output

 ¦- type: java.util.Map<? extends java.lang.Number, ? super javax.swing.JFormattedTextField>
¦- type is an instance of ParameterizedType
¦- ParameterizedType#getOwnerType(): null
¦- ParameterizedType#getRawType(): interface java.util.Map
¦- type: interface java.util.Map
¦- type is an instance of Class
¦- Class Name: java.util.Map
¦- ParameterizedType#getActualTypeArguments(): [? extends java.lang.Number, ? super javax.swing.JFormattedTextField]
¦- ParameterizedType#actualTypeArgument: ? extends java.lang.Number
¦- type: ? extends java.lang.Number
¦- type is an instance of WildcardType
¦- WildcardType#getLowerBounds(): []
¦- WildcardType#getUpperBounds(): [class java.lang.Number]
¦- WildcardType#upperBound: class java.lang.Number
¦- type: class java.lang.Number
¦- type is an instance of Class
¦- Class Name: java.lang.Number
¦- ParameterizedType#actualTypeArgument: ? super javax.swing.JFormattedTextField
¦- type: ? super javax.swing.JFormattedTextField
¦- type is an instance of WildcardType
¦- WildcardType#getLowerBounds(): [class javax.swing.JFormattedTextField]
¦- WildcardType#lowerBound: class javax.swing.JFormattedTextField
¦- type: class javax.swing.JFormattedTextField
¦- type is an instance of Class
¦- Class Name: javax.swing.JFormattedTextField
¦- WildcardType#getUpperBounds(): [class java.lang.Object]
¦- WildcardType#upperBound: class java.lang.Object
¦- type: class java.lang.Object
¦- type is an instance of Class
¦- Class Name: java.lang.Object

package com.logicbig.example.method;

import java.lang.reflect.Method;
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.Objects;

public class GetGenericReturnTypeExample5 {
List<?> process() {return null;}

public static void main(String... args) throws NoSuchMethodException {
Method m = GetGenericReturnTypeExample5.class.getDeclaredMethod("process");
Type type = m.getGenericReturnType();
printType(type, 1);
}

private static void printType(Type type, int level) {
if (type == null) {
return;
}
print(level, "type: " + Objects.toString(type));
if (type instanceof Class) {
print(level, "type is an instance of Class");
print(level, "Class Name: " + ((Class) type).getName());
} else if (type instanceof ParameterizedType) {
print(level, "type is an instance of ParameterizedType");
printParameterizeType((ParameterizedType) type, level + 1);
} else if (type instanceof WildcardType) {
print(level, "type is an instance of WildcardType");
printWildcardType((WildcardType) type, level + 1);
} else {
throw new RuntimeException();
}
}

private static void printWildcardType(WildcardType type, int level) {
Type[] lowerBounds = type.getLowerBounds();
print(level, "WildcardType#getLowerBounds(): " + Arrays.toString(lowerBounds));
for (Type lowerBound : lowerBounds) {
print(level, "WildcardType#lowerBound: " + lowerBound);
printType(lowerBound, level + 1);
}
Type[] upperBounds = type.getUpperBounds();
print(level, "WildcardType#getUpperBounds(): " + Arrays.toString(upperBounds));
for (Type upperBound : upperBounds) {
print(level, "WildcardType#upperBound: " + upperBound);
printType(upperBound, level + 1);
}
}

private static void printParameterizeType(ParameterizedType type, int level) {
Type ownerType = type.getOwnerType();
print(level, "ParameterizedType#getOwnerType(): " + ownerType);
printType(ownerType, level + 1);
Type rawType = type.getRawType();
print(level, "ParameterizedType#getRawType(): " + rawType);
printType(rawType, level + 1);
Type[] types = type.getActualTypeArguments();
print(level, "ParameterizedType#getActualTypeArguments(): " + Arrays.toString(types));
for (Type type1 : types) {
print(level, "ParameterizedType#actualTypeArgument: " + type1);
printType(type1, level + 1);
}
}

private static void print(int level, String string) {
System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string);
}
}

Output

 ¦- type: java.util.List<?>
¦- type is an instance of ParameterizedType
¦- ParameterizedType#getOwnerType(): null
¦- ParameterizedType#getRawType(): interface java.util.List
¦- type: interface java.util.List
¦- type is an instance of Class
¦- Class Name: java.util.List
¦- ParameterizedType#getActualTypeArguments(): [?]
¦- ParameterizedType#actualTypeArgument: ?
¦- type: ?
¦- type is an instance of WildcardType
¦- WildcardType#getLowerBounds(): []
¦- WildcardType#getUpperBounds(): [class java.lang.Object]
¦- WildcardType#upperBound: class java.lang.Object
¦- type: class java.lang.Object
¦- type is an instance of Class
¦- Class Name: java.lang.Object




package com.logicbig.example.method;

import java.lang.reflect.*;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class GetGenericReturnTypeExample6 {
public List<Number> process() {return null;}

public static void main(String... args) throws NoSuchMethodException {
Method m = GetGenericReturnTypeExample6.class.getDeclaredMethod("process");
Type type = m.getGenericReturnType();
printType(type, 1);
}

private static void printType(Type type, int level) {
if (type == null) {
return;
}
print(level, "type: " + Objects.toString(type));
if (type instanceof Class) {
print(level, "type is an instance of Class");
print(level, "Class Name: " + ((Class) type).getName());
} else if (type instanceof ParameterizedType) {
print(level, "type is an instance of ParameterizedType");
printParameterizeType((ParameterizedType) type, level + 1);
} else {
throw new RuntimeException("Unknown type: " + type);
}
}

private static void printParameterizeType(ParameterizedType type, int level) {
Type ownerType = type.getOwnerType();
print(level, "ParameterizedType#getOwnerType(): " + ownerType);
printType(ownerType, level + 1);
Type rawType = type.getRawType();
print(level, "ParameterizedType#getRawType(): " + rawType);
printType(rawType, level + 1);
Type[] types = type.getActualTypeArguments();
print(level, "ParameterizedType#getActualTypeArguments(): " + Arrays.toString(types));
for (Type type1 : types) {
print(level, "ParameterizedType#actualTypeArgument: " + type1);
printType(type1, level + 1);
}
}

private static void print(int level, String string) {
System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string);
}
}

Output

 ¦- type: java.util.List<java.lang.Number>
¦- type is an instance of ParameterizedType
¦- ParameterizedType#getOwnerType(): null
¦- ParameterizedType#getRawType(): interface java.util.List
¦- type: interface java.util.List
¦- type is an instance of Class
¦- Class Name: java.util.List
¦- ParameterizedType#getActualTypeArguments(): [class java.lang.Number]
¦- ParameterizedType#actualTypeArgument: class java.lang.Number
¦- type: class java.lang.Number
¦- type is an instance of Class
¦- Class Name: java.lang.Number




Without any generics:

package com.logicbig.example.method;

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Objects;

public class GetGenericReturnTypeExample7 {
public Number process() {return null;}

public static void main(String... args) throws NoSuchMethodException {
Method m = GetGenericReturnTypeExample7.class.getDeclaredMethod("process");
Type type = m.getGenericReturnType();
printType(type, 1);
}

private static void printType(Type type, int level) {
if (type == null) {
return;
}
print(level, "type: " + Objects.toString(type));
if (type instanceof Class) {
print(level, "type is an instance of Class");
print(level, "Class Name: " + ((Class) type).getName());
} else {
throw new RuntimeException("Unknown type: " + type);
}
}

private static void print(int level, String string) {
System.out.printf("%" + (level * 4 - 3) + "s\u00A6- %s%n", "", string);
}
}

Output

 ¦- type: class java.lang.Number
¦- type is an instance of Class
¦- Class Name: java.lang.Number




See Also