• Java反射、注解


    1.反射

     

     

    案例:

    需求:写一个“框架”,不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法

    实现:

      1.配置文件

      2.反射

    步骤:

      1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中

      2.在程序中加载读取配置文件

      3.使用反射技术来加载类文件进内存

      4.创建对象

      5.执行方法

     代码:

    结构:

    在src下创建File(配置文件),命名pro.properties   

    文件内容:

    className = cn.itcast.domain.Student
    methodName = sleep

    Student中有sleep方法:

    public class Student {
    
        public void sleep() {
            System.out.println("sleep...");
        }
    }

    Person中有eat方法:

    public class Person {
    public void eat() {
            System.out.println("eat...");
        }
    
        public void eat(String food) {
            System.out.println("eat..."+food);
        }
    }

    ReflectTest:

    /**
     * 框架类
     */
    
    public class ReflectTest {
        public static void main(String[] args) throws Exception {
            /*
                前提:不能改变该类的任何代码,可以创建任意类的对象,可以执行任意方法
             */
            //1.加载配置文件
            //1.1创建properties对象
            Properties pro = new Properties();
            //1.2加载配置文件,转换为一个集合
            //1.2.1获取class目录下的配置文件
            ClassLoader classLoader = ReflectTest.class.getClassLoader();
            InputStream is = classLoader.getResourceAsStream("pro.properties");
            pro.load(is);
    
            //2.获取配置文件中定义的数据
            String className = pro.getProperty("className");
            String methodName = pro.getProperty("methodName");
    
            //3.加载该类进内存
            Class cls = Class.forName(className);
            //4.创建对象
            Object obj = cls.newInstance();
            //5.获取方法对象
            Method method = cls.getMethod(methodName);
            //6.执行方法
            method.invoke(obj);
        }
    }

    运行ReflectTest的结果:

     如果想要读取不同类的不同方法,不需要修改ReflecTest的代码,只要修改配置文件pro.properties的内容即可,例如,将代码修改如下:

    className = cn.itcast.domain.Person
    methodName = eat

    运行ReflectTest的结果:

     PS:后来想到Person中还有一个有参的eat方法,实现调用的方法:将ReflectTest中下列语句:

             //5.获取方法对象
            Method method = cls.getMethod(methodName);
            //6.执行方法
            method.invoke(obj);        
        

    修改为:

            //5.获取方法对象
            Method method = cls.getMethod(methodName,String.class);
            //6.执行方法
            method.invoke(obj,"饭");

    运行ReflectTest的结果:


     2.注解

  • 相关阅读:
    详解RTMP协议视频直播点播平台EasyDSS转推视频直播流到CDN(云直播)
    RTMP协议视频直播点播平台EasyDSS如何实现RTSP视频流地址加密?
    阿里王坚:“城市大脑”开启算力时代
    数据中心网络测试自动化的逐步发展
    在数据中心利用AI的5个理由
    基于层次过滤的文本生成
    解密为何 Go 能从众多语言中脱颖而出
    乔姆斯基专访:深度学习并没有探寻世界本质
    释放数据价值的「三个关键点」
    改改Python代码,运行速度还能提升6万倍,Science:先别想摩尔定律了
  • 原文地址:https://www.cnblogs.com/carrothhh/p/14026032.html
Copyright © 2020-2023  润新知