// 举例01
public class Reflect{
// 静态性
public Person getInstance(){return new Person();
}// 动态性
public T<T> getInstance(String className) throws Exception{Calss clzz = Class.forName(className);Constructor con = class.getDeclaredConstructor();con.setAccessible(true);return (T)con.newInstance();
}// 动态性
public Object invoke(String className,String methodName) throws Exception{// 1.创建全类名对应的运行时类的对象Calss clzz = Class.forName(className);Constructor con = class.getDeclaredConstructor();con.setAccessible(true);Object obj = con.newInstance();// 2.获取运行时类中指定的方法,并调用Method method = clazz.getDeclaredMethod(methodName);method.setAccessible(true);return method.invoke(obj);
}
}
案例:榨汁机榨水果汁,水果分别有果(com.reflect.Apple)、香蕉(Banana)、桔子(Orange)等。
效果如图。
提示:
1、声明(Fruit)水果接口,包含榨汁抽象方法: void squeeze(); /skwi:z/
2、声明榨汁机(Juicer),包含运行方法: public void run(Fruit f),方法体中,调用f的榨汁方法squeeze()
3、声明各种水果类,实现水果接口,并重写squeeze();
4、在src下,建立配置文件: config.properties,并在配置文件中配上fruitName=xXx(其中xx为某种水果的全类名)
5、在FruitTest测试类中,
(1)读取配置文件,获取水果类名,并用反射创建水果对象,
(2)创建榨汁机对象,并调用run()方法