Java学习---反射

前言:

      最近在复习Java基础,以前没有怎么注意到Java反射,复习Java反射的时候才发现反射这一块很重要,可能现在小弟内力还不够深厚,不足一下子全部掌握,反射概念有点抽象,我大概总结下自己所学的知识点吧。

 概述:

反射是框架设计的灵魂

反射就是把java类中的各种成分映射成一个个的Java对象

反射:将类的各个组成部分封装为其他对象

好处:

  • 可以在程序运行中,操作这些对象 
  • 可以解耦,提高程序的可扩展性

在这里(如图)描叙下类的加载:

Class对象的由来是将class文件读入内存,并为之创建一个Class对象

获取Class对象的方式:

1.Calss。forName("全类名"):将字节码文件加载进内存,返回Calss对象

*多用于配置文件,将类名定义在配置文件中。读取文件,加载类

2.类名.class: 通过类名的属性class获取

*多用于参数的传递

3.对象.getClass()

*多用于对象的获取字节码的方式

 public static void main(String[] args) throws Exception{
        //Class。forName("全类名")
        Class<?> aClass = Class.forName("com.reflect.study.demo.Person");
        System.out.println(aClass);
        //类名.class
        Class<Person> personClass = Person.class;
        System.out.println(personClass);
        //对象.getClass()
        Person person = new Person();
        Class<? extends Person> aClass1 = person.getClass();
        System.out.println(aClass1);
    }

 

结论: 

同一个字节码文件(*.class)再一次程序运行过程中,只会被加载一次,不论通过那种方式获取的class对象都是同一个

 

获取对象的成员变量们

 public static void main(String[] args) throws Exception {
        //获取对象的class对象
        Class personClass = Person.class;
        
        //获取成员变量们
        //Field[] getFields() 获取所有public修饰的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

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

        System.out.println("--------------");
        //Field[] getDeclaredFields()获取所有的成员变量,不考虑修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
    }

获取构造方法们

 public static void main(String[] args) throws Exception {
        Class<Person> personClass = Person.class;
        Constructor constructor = personClass.getConstructor(String.class, int.class);
        System.out.println(constructor);

        //创建对象
        Object o = constructor.newInstance("张三", 23);
        System.out.println(o);
    }

获取成员方法们

 public static void main(String[] args) throws Exception {
        Class<Person> personClass = Person.class;
        //获取指定方法
        Method eat = personClass.getMethod("eat");
        Person p = new Person();
        eat.invoke(p);

        Method eat1 = personClass.getMethod("eat", String.class);
        eat1.invoke(p,"蔬菜");

        //获取所有public修饰的方法
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
    }

总结:

       我大概也只是掌握一些Class类的API怎么去使用和大概知道反射是一个什么东东,至于怎么去程序中去使用它,我也不知道,知识尚未掌握,望自己还须更加努力!推荐一篇大佬写的博客:                                https://blog.csdn.net/sinat_38259539/article/details/71799078

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值