package Reflect.Peng;
/* 对比正常new对象和reflect创建对象,假设存在str_obj中对象运行中未知,从外部导入*/
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class Apple{
private float price;
public String type = "Iphone 100SE";
public void setPrice(float price) {
this.price = price;
}
public float getPrice() {
return price;
}
}
public class P0107ReflectExample {
public static void main(String[] args)
throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException,
InvocationTargetException, InstantiationException, NoSuchFieldException {
Apple direct_creat = new Apple();
direct_creat.setPrice((float) 3999.5);
System.out.println("直接创建Apple对象,调用方法:" + direct_creat.getPrice());
//Reflect方法:forName得到导入的类型,getMethod调用方法, getConstructor构造,.instance实例化
String str = "Reflect.Peng.Apple";
String[] mtd = {"setPrice", "getPrice"};
Class clazz = Class.forName(str);//throw找不到方法的异常
Method setPr = clazz.getMethod(mtd[0], float.class); //找不到方法的异常处理
Object reflect_obj = clazz.getDeclaredConstructor().newInstance();
//调用设置方法
setPr.invoke(reflect_obj, (float)5999.5);
//调用get获取方法
Method getPr = clazz.getDeclaredMethod(mtd[1]);
System.out.println("反射的apple对象创建,调用方法返回结果" + getPr.invoke(reflect_obj));
/*直接创建很方便,new一下,直接.点调用即可;
* 反射创建看似比较复杂,需要forname得到Class类,然后对象要用getDeclaredConstructor进行newInstance,
* 方法需要用clazz的getMethod返回Method对象,通过invoke来执行调用; getFields获取属性
* 然而,这种好处是对象类型和执行完全解耦了,这对于企业编程,大型程序的配置、运行分离非常关键;大为简化运行难度,提升配置灵活性;
* 所以这称为大名鼎鼎的Spring编程的关键思想,配置、数据、运行解耦 */
Field val = clazz.getField(clazz.getField("type").getName());
System.out.println("变量名:" + clazz.getField("type") +
"\nApple型号: " + val.get(reflect_obj));
}
}
output
直接创建Apple对象,调用方法:3999.5
反射的apple对象创建,调用方法返回结果5999.5
变量名:public java.lang.String Reflect.Peng.Apple.type
Apple型号: Iphone 100SE