// 举例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()方法