1.通过反射获取泛型信息
示例代码:
package AnnotationTest;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
public class A9 {
public Map<Integer,String> function(Set<Boolean> s, HashMap<Queue,Short> h){
return null;
}
public static void main(String[] args) throws NoSuchMethodException {
Method function = A9.class.getDeclaredMethod("function", Set.class, HashMap.class);
Type[] genericParameterTypes = function.getGenericParameterTypes();
System.out.println(genericParameterTypes);
for (Type genericParameterType : genericParameterTypes) {
System.out.println("all: " + genericParameterType);
if(genericParameterType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
System.out.println("************");
Type genericReturnType = function.getGenericReturnType();
System.out.println("all: " + genericReturnType);
if(genericReturnType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
}
结果:
2.反射操作注解
getAnnotation()
getAnnotations()
示例代码:
package AnnotationTest;
import java.lang.annotation.*;
import java.lang.reflect.Field;
public class A10 {
public static void main(String[] args) throws NoSuchFieldException {
Class<Book> c = Book.class;
Annotation[] annotations = c.getAnnotations();
System.out.println(annotations);
for (Annotation annotation : annotations) {
System.out.println(annotation);
System.out.println(((test1)annotation).value());
}
Field isbn = c.getDeclaredField("isbn");
for (Annotation annotation : isbn.getAnnotations()) {
System.out.println(annotation);
System.out.println(((test2)annotation).num());
System.out.println(((test2)annotation).flag());
}
}
}
@test1(80)
class Book{
@test2(num=85,flag = true)
int isbn;
@test2(num = 999,flag = false)
String name;
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface test1{
int value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface test2{
int num();
boolean flag();
}