• 反射


    1.反射框架设计的灵魂

      框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。

      反射:将类的各个组成部分封装成其他对象,这就是反射机制。要理解这句话首先得了解java代码在计算机中经历的三个阶段。

        Java代码的三个阶段:

            

    2.反射的好处

      1.可以在程序运行的过程中,操作这些对象。

      2.可以解耦,来提高程序的可扩展性。

    3.获取Class的三种方式

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

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

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

        1.多用于参数的传递

      3.对象.getClass():getClass()方法在Object类中定义。

        1.多用于对象的获取字节码的方式。

      4.示例代码

    package cn.itcast.reflect;
    
    import cn.itcast.domain.Person;
    
    public class ReflectDemo1 {
    
        public static void main(String[] args) throws Exception {
            
            
            Class cls1 = Class.forName("cn.itcast.domain.Person");
            System.out.println(cls1);    //class cn.itcast.domain.Person
            
            Class cls2 = Person.class;
            System.out.println(cls2);    //class cn.itcast.domain.Person
            
            Person p = new Person();
            Class cls3 = p.getClass();
            System.out.println(cls3);    //class cn.itcast.domain.Person
            
            
            System.out.println(cls1 == cls2);//true
            System.out.println(cls1 == cls3);//true
        }
    }

      5.结论:

        同一个字节码文件(*.class)在一次程序运行的过程中,只会被加载一次,无论是通过哪种方式获取的Class。

    4.使用Class对象

      1.Class对象功能:

        1.获取功能:

          1.获取成员变量们

            1.Field[] getFields():获取所有public修饰的成员变量

            2.Field getField(String name):获取指定名称的public修饰的成员变量

            3.Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符

            4.Field getDeclaredField(String name):获取指定名称的成员变量,不考虑修饰符

            5.操作:

              1.设置值: 

                 field.set(Object obj, Object value)

              2.获取值:

                 field.get(Object obj)

              3.在访问非public的成员变量时可以调用setAccessible(true)来忽略访问权限修饰符的安全检查,也就是暴力反射。

          2.获取构造方法们

            1.Constructor<?>[] getConstructors()

            2.Constructor<?> getConstructors(类<?>... patameterTypes)

            3.Constructor<?> getDeclaredConstructors(类<?>... patameterTypes)

            4.Constructor<?>[] getDeclaredConstructors()

            5.操作:

              1.创建对象:

                T newInstance(Object... initargs)

                如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法(如Person.class.newInstance())

          3.获取成员方法们

            1.Method[] getMethods():

            2.Method getMethod(String name, 类<?>... parameterTypes):

            3.Method[] getDeclaredMethods():

            4.Method getDeclaredMethod(String name, 类<?>... parameterTypes):

            5.操作:

              执行方法:

                Object invoke(Object obj, Object... args)

              获取方法名:

                String getName()

            4.获取类名

            1.String getName();

    5.反射的使用案例

     

     1.配置文件pro.properties:

     2.框架类ReflectTest

    执行框架类的main方法,就可以创建Person对象并且调用对应的Person中的方法,如果要创建其他对象如Student对象,只需修改配置文件pro.properties中的内容即可。

      

      

    你还有很多未完成的梦,你有什么理由停下脚步
  • 相关阅读:
    关于重复记录
    easyui-dataGrid
    初尝easyui
    字符串处理の合并记录行
    实现P2P远程控制项目的基本逻辑
    命令行启动vscode中的ssh-remote插件并指定路径
    关于TCP三次握手的意义及其具体实现解释
    Git使用建议及规范
    MySQL C API的参数化查询
    gdb定位程序CPU占用过高问题
  • 原文地址:https://www.cnblogs.com/quanziheng/p/12298532.html
Copyright © 2020-2023  润新知