java的动态代理如果利用好了,可以拓展一个类的功能。举个例子,mybatis是怎么把interface的方法和mapper文件里的sql语句关联?mybatis的getMapper(),就是通过动态代理,从map中根据该方法名称,得到要执行的sql,最后交给executor执行。
动态代理实现:继承InvocationHandler类,然后重写invoke()方法
正常实现:
public class proxyTest implements InvocationHandler{
public Object invoke(Object proxy, Method method ,Object[] args){
//method :被代理对象执行的方法
//args:被代理对象执行的方法传入的参数
}
}
public static void main(String[] args){
ProxyTest proxy = new ProxyTest();
User u = (User)Proxy.newProxyInstance(p.getClass().getClassLoader(),new Class[]{User.Class},proxy);
u.do();
}
这是最简便的写法
封装一下:
public class ProxyTest implements InvocationHandler{
public <T> T newInstance(Class<T> cls){
return (T) Proxy.newProxyInstance(T.getClassLoader(),new Class[]{T},this)
}
public Object invoke(Object proxy, Method method ,Object[] args){
//method :被代理对象执行的方法
//args:被代理对象执行的方法传入的参数
}
}
所有的类都有父类Object,Object有9个方法toString,equals,wait,notify,notifyAll,,hashcode,finalize,clone,getClass,如果是这些方法要把它们过滤,
java.lang.reflect.Method.getDeclaringClass()方法返回表示声明由此Method对象表示的方法的类的Class对象。
if(Object.class.equals(method.getDeclaringClass())){
return method.invoke(this,args);//this这个对象调用method这个方法,参数是args
}