反射概述和反射获取字节码Class对象的三种方式

反射:框架设计的灵魂

框架:半成品软件。可以在框架的基础上进行软件开发,简化变法
反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:
1.可以在程序运行的过程中操作这些对象。
2.可以解耦,投稿程序的可扩展性
image

Class对象功能:
获取功能:
1.获取成员变量们
Field[] getFields()获取所有public修饰的成员变量
Field getField(String name)

Field[] getDecalredFields()
Field getDeclaredField(String name)

2.获取构造方法们
Constructor[] getConstructors() Constructor getConstructor(类... parameterTypes)

Constructor getDeclareConstructor(类... paramterTypes) Constructor[] getDeclaredConstructors()获取所有的成员变量不考虑修饰符

3.获取成员方法们
Method[] getMethod()
Method getMethod(String name,类<?>... paramterTypes)

Method[] getDeclaredMethods()
Method getDeclaredMethod(String name,类<?>... paramterTypes)

4.获取类名
String getName()

Field:成员变量
操作:
1.设置值
void set(Object obj , Object value)
2.获取值
get(Object obj)
3.忽略访问权限修饰符的安全检查
setAccessible(true)暴力反射

package com.yang.reflect;

import com.yang.exercises.Person;

import java.lang.reflect.Field;

public class ReflectStudy01 {

    public static void main(String[] args) throws Exception {
        //获取Person的class对象
        Class<Person> personClass = Person.class;
        /**
         * 1.获取成员变量们
         * Field[] getFields()
         * Field getField(String name)
         *
         * Field[] getDecalredFields()
         * Field getDeclaredField(String name)
         */
        //Field[] getFields()
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        //Field getField(String name)
        Field a = personClass.getField("a");

        //获取成员变量a的值
        Person p = new Person();
        Object value = a.get(p);
        System.out.println(value);
        //设置a的值
        a.set(p,"啦啦啦a");
        System.out.println(p);

        //Field[] getDecalredFields()
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        //Field getDeclaredField(String name)
        Field a1 = personClass.getDeclaredField("a");
        Object value2 = a1.get(p);
        System.out.println(value2);
    }
}
posted @ 2022-07-22 10:42  我滴妈老弟  阅读(26)  评论(0)    收藏  举报