一、反射的理解
Java的反射机制就是 在运行状态下①,可以获取任意一个类或着对象的所有信息(包名及类名、所有方法、所有属性【包括private私有属性】),并且可以随意调用方法或更改属性。
①:因为java的反射机制是从JVM虚拟机中获取已编译的class类,转化到内存中,成为一个存在内存中的可更改的动态类。所以需要在运行状态下。
二、通过反射获取类共有三种方法
1、通过带包名的类名获取
Class clazz = Class.forName("com.wanmait.test.Test");
2、通过对象获取
Person person = new Person(); Class clazz = person.getClass();
3、通过类名.class获取(每一个类都有一个隐藏静态属性class)
Class clazz = Person.class;
三、反射常用的方法
1、获取带包名的类名
String className = clazz.getName();
2、获取不带包名的类名
String className = clazz.getSimpleName();
3、获取所有public方法和父类方法的信息(修饰符、返回值、包名+类名+方法名、参数)
Method[] methods = clazz.getMethods();
4、获取类本身所有方法的信息(修饰符、返回值、包名+类名+方法名、参数)【包含私有方法,不包含父类方法】
Method[] methods = clazz.getDeclaredMethods();
5、只获取方法的名字
String methodName = methods[i].getName();
6、获取方法的返回值
Class returnType = methods[i].getReturnType();
7、获取方法返回值的名字
String returnName = returnType.getSimpleName();
8、获取方法的参数
Parameters[] parameter = methods[i].getParameters();
9、获取参数的类型
Class paramType = parameter[i].getType();
10、获取类的public属性
Field[] fields = clazz.getFields();
11、获取类的所有属性
Field[] fields = clazz.getDeclaredFields();
12、获取一个方法
Method method = clazz.getDeclaredMethod("方法名","参数");//根据参数数量分辨调用的方法 Method method = clazz.getDeclaredMethod("方法名");//只写方法名就是调用无参函数
13、通过反射获得的类创建对象
Person person = (Person)clazz.getDeclaredConstructor().newInstance();
13、执行方法(需创建对象)
method.invoke(对象); method.invoke(对象,参数);
14、把private的方法设置为可调用
method.setAccessible(true);
15、获取类的一个属性
Field field = clazz.getField("age");
16、获取某一对象里的属性的值(需创建对象)
Object fieldValue = field.get(对象);
17、设置某一对象的属性的值(需创建对象)
field.set(对象,值);
666