反射获取类信息
重要方法:
构造器相关:
Constructor<T> getConstructor(Class<?>... parameterTypes)
# 获取指定类型的构造方法Constructor<?>[] getConstructors()
# 获取全部构造方法
方法相关
Method getMethod(String name, Class<?>... parameterTypes)
#获得指定类型方法Method[] getMethods()
#获得全部方法
成员变量相关:
Field getField(String name)
# 获得成员变量Field[] getFields()
# 获得所有成员变量
以上方法包含两种形态,一种只能获取public权限的,一种可以无视权限的。其规则如下:
例如:getField 表示:获取public权限;getDeclaredField表示,无视权限;其差别仅多一个“Declared”
注解相关:
<A extends Annotation> A getAnnotation(Class<A> annotationClass)
# 获取类对象注解getDeclaredAnnotation
# Java8新出方法,作用:获取直接修饰该类的注解Annotation[] getAnnotations()
获取修饰类的所有注解<A extends Annotation> A[] getAnnotationsByType(Class<A> annotationClass)
# Java8新出方法:获取指定类型注解在当前类上。
Class相关:
Class<?>[] getDeclaredClasses()
# 获取所有内部类Class<?> getDeclaringClass()
# 获取类的外部类Class<?>[] getInterfaces()
# 获取接口Class<? super T> getSuperclass()
# 获取父类int getModifiers()
# 获取真实修饰符,如:public privatePackage getPackage()
# 获取包getName、getSimpleName
# 获取名称
判断是否为类、接口、枚举等:isArray、isAnnotation…
反射获取方法
clz.getMethod("info", String.class)
将会获取一个名叫info且只有一个String类型参数的方法,例如:
info(String string)
getMethod方法:第一个参数为“将要获取的方法名称”,后面可变参数为参数类型。
获取构造器只需要确认参数列表即可,因为构造器只有一个方法名。
使用反射操作对象
Class对象可以获取类中的方法(Method)、构造器(Constructor)、成员变量(Field),这三个类都处于java.lang.reflect包下。
创建对象
- clz.newInstance()
- constructor.newInstance()
调用方法
TestClass obj = TestClass.class.newInstance();
Class cls = TestClass.class;
Method m = cls.getMethod("info", String.class);
m.invoke(obj, "你好呀~");
调用invoke方法即可,第一个参数传递方法的实例对象。第二个传递参数。
设置属性值
Field field = cls.getField("age");
field.set(obj, 10);
obj为实例对象
若无法访问,尝试调用setAccessible设置为true
获取泛型类型
变量声明为:public HashSet<TestClass> set;
Class cls = TestClass.class;
Field f = cls.getField("set");
ParameterizedType pt = (ParameterizedType) f.getGenericType();
System.out.println("原始类型:" + pt.getRawType());
Type[] ata = pt.getActualTypeArguments();
System.out.println("泛型类型:" + ata[0]);