案例:反射综合运用(体会反射的优点)

需求:

      写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
      创建Peron对象,调用eat方法
      创建Student对象,调用study方法
      创建Worker对象,调用work方法

解决:使用反射技术:

  1. 创建一个Properties集合的配置文件,里边写全类名和方法名称
    Properties集合:https://blog.csdn.net/qq_45083975/article/details/90721915
  2. 使用Properties集合+IO流读取配置文件,获取配置文件中键值对
  3. 使用Properties集合中的方法getProperty,通过key获取全类名
  4. 使用Properties集合中的方法getProperty,通过key获取方法名称
  5. 使用获取到的全类名,通过反射技术获取Class文件对象
  6. 使用Class文件对象中的方法newInstance实例化对象
  7. 使用方法名称获取要执行的方法的Method对象
  8. 使用Method类中的方法invoke执行方法

代码实现:

Person类:

package com.ccc.demo04Reflect;

public class Person {
    public void eat(){
        System.out.println("人是铁,饭是钢,一顿不吃饿得慌!");
    }
}

Student类:

package com.ccc.demo04Reflect;

public class Student {
    public void study(){
        System.out.println("作为一个程序猿,目标敲代码!");
    }
}

Work类:

package com.ccc.demo04Reflect;

public class Worker {
    public void work(){
        System.out.println("只有敲代码,才能挣钱娶个漂亮媳妇!");
    }
}

Work类:

package com.ccc.demo04Reflect;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.Properties;

public class Demo01ReflectTest {
    public static void main(String[] args) throws Exception {
        //Person p = new Person();
        //p.eat();
        //1.创建一个Properties集合的配置文件,里边写全类名和方法名称
        //2.使用Properties集合+IO流读取配置文件,获取配置文件中键值对
        Properties prop = new Properties();
        prop.load(new FileReader("day10\\prop.txt"));
        //System.out.println(prop);
        
        //3.使用Properties集合中的方法getProperty,通过key获取全类名
        String className = prop.getProperty("className");
        
        //4.使用Properties集合中的方法getProperty,通过key获取方法名称
        String methodName = prop.getProperty("methodName");

        //5.使用获取到的全类名,通过反射技术获取Class文件对象
        Class clazz = Class.forName(className);
        
        //6.使用Class文件对象中的方法newInstance实例化对象
        Object obj = clazz.newInstance();
        
        //7.使用方法名称获取要执行的方法的Method对象
        Method method = clazz.getMethod(methodName);
       
        //8.使用Method类中的方法invoke执行方法
        method.invoke(obj);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45083975/article/details/91975966