反射-反射的应用案例
反射的应用实例
接口
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来通过反射获取具体是哪一个类的对象来调用方法