首页 > 技术文章 > Java反射、注解

carrothhh 2020-11-23 18:14 原文

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.注解

 

 

 

 

 

 

 

推荐阅读