反射-反射的应用案例

反射的应用实例

接口

public interface Fruit {
    //榨汁儿的方法
    void squeeze();
}

水果实体类

public class Apple implements Fruit{
    @Override
    public void squeeze() {
        System.out.println("榨一杯苹果汁");
    }
}
public class Banana implements Fruit{
    @Override
    public void squeeze() {
        System.out.println("榨一杯香蕉汁");
    }
}
public class Orange implements Fruit{
    @Override
    public void squeeze() {
        System.out.println("榨一杯橘子汁");
    }
}

榨汁类,榨汁方法

public class Juicer {
    public void run(Fruit f)
    {
        //传进来一个Fruit的对象,使用这个对象调用其类中方法
        f.squeeze();
    }
}

测试方法

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.util.Properties;

public class FruitTest {
    @Test
    public void test() throws Exception {
        //读取配置文件中的信息,获取全类名
        Properties pros = new Properties();
        File file = new File("src/config.properties");
        FileInputStream fis = new FileInputStream(file);
        pros.load(fis);
        String fn = pros.getProperty("fruitName");
        //通过反射,指定全类对应类的实例
        Class clazz = Class.forName(fn);
        Constructor co = clazz.getDeclaredConstructor();
        co.setAccessible(true);
        //通过对象调用run()
        Fruit fruit = (Fruit) co.newInstance();
        Juicer juicer = new Juicer();
        juicer.run(fruit);
    }
}

此案例体现了反射动态的特性,在此案例中,实体类的对象是未定义的,通过配置文件config.properties来通过反射获取具体是哪一个类的对象来调用方法