反射

41 阅读2分钟

反射

Class

获取到对应class的各种信息:加载该类的类加载器,方法,字段,构造器,全类名

1,获取Class对象的方法

方面名称
static Class forName(String name)静态方法
对象.getClass()
类.class

2,获取类的构造方法

获取访问修饰符为:public

方法说明
Constructor<?> getConstructor(Class... parameterTypes)根据参数类型获取该类的public构造方法
Constructor[] getConstructors()获取该类的所有public构造方法
package ekko.spring.v1.test;
public class testdemo {
    private String name;
    public String password;
    int i;
    public testdemo(){}
    public testdemo(int i){
        System.out.println(i);
    }
    
    private testdemo(String t){
        System.out.println(t);
    }

    testdemo(Long i){
        System.out.println(i);
    }
}
Class<?> testdemo1 = Class.forName("ekko.spring.v1.test.testdemo");
        
Constructor<?> constructor = testdemo1.getConstructor(int.class);
Constructor<?> constructor2 = testdemo1.getConstructor();
System.out.println(constructor);
System.out.println(constructor2);
//public ekko.spring.v1.test.testdemo(int)
//public ekko.spring.v1.test.testdemo()

Constructor<?>[] constructors = testdemo1.getConstructors();
for (Constructor c: constructors) {
	System.out.println(c);
}
//public ekko.spring.v1.test.testdemo(int)
//public ekko.spring.v1.test.testdemo()

获取所有修饰符的方法

方法说明
Constructor getDeclaredConstructor(Class... parameterTypes)根据参数类型获取构造方法
Constructor[] getDeclaredConstructors()获取所有构造构造方法
System.out.println(testdemo1.getDeclaredConstructor(String.class));
//private ekko.spring.v1.test.testdemo(java.lang.String)
Constructor[] declaredConstructors = testdemo1.getDeclaredConstructors();

for (Constructor c: declaredConstructors) {
	System.out.println(c);
}
//ekko.spring.v1.test.testdemo(java.lang.Long)
//private ekko.spring.v1.test.testdemo(java.lang.String)
//public ekko.spring.v1.test.testdemo(int)
//public ekko.spring.v1.test.testdemo()

3,获取类的字段

方法说明
Field getField(String name)根据属性名称获取public的属性
Field[] getFields()获取所有的public的属性
Field getDeclaredField(String name)根据属性名称获取属性
Field[] getDeclaredFields()获取所有的属性

4,获取类的方法

方法说明
Method getMethod(String name, Class... parameterTypes)通过参数类型获取修饰符为public的方法
Method[] getMethods()获取所有的public的方法
Method getDeclaredMethod(String name, Class... parameterTypes)根据参数类型获取任意的方法
Method[] getDeclaredMethods()获取所有的方法

5,获取类的注解

方法说明
<A extends Annotation> A getAnnotation(Class annotationClass)获取指定注解
Annotation[] getAnnotations()获取所有注解
<A extends Annotation> A getDeclaredAnnotation(Class annotationClass)获取指定的不可继承注解
Annotation[] getDeclaredAnnotations()获取所有不饿继承的注解

Constructor

方法说明
void setAccessible(boolean flag)设置为true,不检查方法的修饰符
T newInstance(Object... initargs)创建对象

Method

方法说明
void setAccessible(boolean flag)设置为true,不检查方法的修饰符
Object invoke(Object obj, Object... args)使得某个对象执行该方法

Field

方法说明
void setAccessible(boolean flag)设置为true,set和get时不检查的修饰符
void set(Object obj, Object value)设置某个对象的该属性值
Object get(Object obj)获取该obj对象的该属性

Array

有时候方法返回值是数组,但是返回的对象是Object类型,需要通过反射包提供的工具类进行处理

方法说明
static Object get(Object array, int index)`指定索引的值