java动态代理:
hello接口
public interface Hello {
void sayHello();
}
HelloImp实现
public class HelloImp implements Hello {
public void sayHello() {
System.out.println("你好,世界!");
}
}
public class MDynamicProxy implements InvocationHandler {
private Object target;
public MDynamicProxy(Object target){
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
beforeInvoke();
Object result = method.invoke(target, args);
afterInvoke();
return result;
}
private void beforeInvoke(){
System.out.println("方法执行之前");
}
private void afterInvoke(){
System.out.println("方法执行之后");
}
}
@Test
public void test1(){
// 需求代理的类
Hello hello = new HelloImp();
// 方法拦截器
MDynamicProxy dynamicProxy = new MDynamicProxy(hello);
/**
* 包含了方法拦截器的代理
* 该代理类的所有的可执行的方法都会被dynamicProxy拦截
* 所以dynamicProxy《拦截了所有的方法》之后,再根据《方法名》
* 去找到被代理类的相应的方法名,并执行响应的方法
*/
Hello helloProxy = (Hello) Proxy.newProxyInstance(
hello.getClass().getClassLoader(),
hello.getClass().getInterfaces(),
dynamicProxy
);
System.out.print("代理之前:");
hello.sayHello();
System.out.print("代理之后:");
helloProxy.sayHello();
}
通过查看Proxy源码可以知道,proxy通过newProxyInstance生成代理类:1、该类包含了接口所有的方法;2、该类所有的方法调用会被分发到dynamicProxy类上(Method是被调用的方法信息的封装);3、method.invoke(target, args)会在被代理类上寻找是否有该方法的信息,如果有那么就调用。
上述是动态代理的核心要点
总结:Method、Class这些是描述对象的对象,是属于“元”素据,代理通过对对象的元数据在运行时进行查找分析等实现了Java的反射机制和动态代理(PS:元数据是描述对象的数据,所以可以通过元数据生成相应的对象)