反射:reflect
Class:所有类的字节码文件
Class.forName(全类名);
类名.class;
实例.getClass();
Field:getDeclaredField("");/getDeclaredFields();
修饰符/类型/名称
Method:
获取:getDeclaredMethod("",参数类型的class...param);/getDeclaredMethods();
注:此时返回类型Method
调用:invoke(实例,实参值...obj)
注:返回Object类型,如果调用的方法有返回值,从invoke的返回结果里取出值;
Constructor
实例方法一:
获得类的构造器:Constructor c=类对象.getDeclaredConstructor(参数类型的class...)
调用构造器:c.newInstance(实参值...obj); ---获得该类的实例
实例方法二:
类对象.newInstance(); ---调用该类的无参构造器,直接获得的是该类的实例
反射应用:
BaseService
在service层处理请求中的分发(寻找要调用的方法):
页面发起请求:例,/goods?action=all
在service中接收到goods请求,与现有的地址相匹配,寻找对应的servlet,进入servlet后,具体的业务实现定义在了该servlet中的方法里
class GoodsService extends BaseService{
protected void all(HttpServletRequest req,HttpServletResponse resp){
}
}
class Goods2Service extends BaseService{
protected void all(HttpServletRequest req,HttpServletResponse resp){
}
}
class Goods3Service extends BaseService{
protected void all(HttpServletRequest req,HttpServletResponse resp){
}
}
定义了一个所有service的父类BaseService:使用反射方式查找所请求的servlet中的方法:
class BaseService extends HttpServlet{
protected void service(HttpServletRequest req,HttpServletResponse resp){
String action=req.getParameter("action");
Class clazz=this.getClass();
Object obj=claszz.newInstance();
Method method=clazz.getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(obj,req,resp);
}
}