因为最近都在写python,之前的笔记都保存在有道云里面。java的内容很少,但学了这么久,也算是一个机会做一个总结。
对于java中的一些高级特性,例如反射,动态代理等,我会一一写出用法和项目中大概用的场景(其实大部分框架以及搭好了),主要是给我自己总结一下
反射
我们在学习一项技术的时候,一定要明白这项技术的使用场景,也就是说为什么会有这项技术的出现,是为了解决什么问题,反射的作用是在获取到类的名字的同时,jvm会new一个class对象
jdk中这句话可以告诉我们class对象的产生
类对象由Java虚拟机自动构建,因为加载了类,并且通过调用类加载器中的defineClass方法
获取到这个class对象之后,我们就拥有这个类的字段,方法,甚至通过这个对象的名字动态的创建类的实例。单独看这个功能其实没什么用,因为直接把对象new出来也是一样的效果,但和其他东西结合一下就不一样了
和工厂模式结合
有时候我们在做项目的时候,工厂模式根本不知道要创建具体哪一个类,例如
interface person{ public abstract void eat(); } class student implements person{ public void eat(){ System.out.println("Apple"); } } class teacher implements person{ public void eat(){ System.out.println("Orange"); } }
同样是实现了person接口,当这工厂模式返回实例,可能并不知道到底要哪个实例
class Factory{ public static person getInstance(String ClassName){ person p=null; try{ p=(person)Class.forName(ClassName).newInstance(); }catch (Exception e) { e.printStackTrace(); } return p; } }
这种时候使用反射可以动态的创建出实例,这样无论这个接口有多少个实现类,我们都不用自己去new,实现类与类的解耦
和继承集合
其实,和上面的例子差不多,只不过上面反射动态创建实例,这个例子反射调用方法,在做web开发的时候,每一个servlet都要写doget,dopost的方法,所有的业务逻辑从这两个方法开始,为了解耦(其实是为了少写代码),我们可以自己写一个
baseservlet,这个servlet根据url的参数,调用对应的方法,
例如url请求 /product?method=delProFormCart 根据这个method参数,调用业务逻辑,附上代码
public class BaseServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); /* * 这个this指代的调用该service的类 * */ Class clazz=this.getClass(); String methodName=req.getParameter("method"); try { Method method=clazz.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class); method.invoke(this,req,resp); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }}
method.invoke(this,req,resp); invoke这个方法有第一个参数是你调用方法本身类的实例,后面是改方法的参数,注意,反射的同时这个对象还是被创建了,因此实际上我debug看一下,反射执行的方法依旧是在那个类里面实现的 总结 学动态代理的时候和反射老是搞不清楚,所以回头总结一下,反射并没有对类或者方法增强,只是调用。