接口
package com.test.proxy; public interface IHello { public void sayHello(); }
具体实现类package com.test.proxy; public class Hello implements IHello { @Override public void sayHello() { // TODO Auto-generated method stub System.out.println("hello world vinthy"); } }
动态代理类及测试package com.test.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyHello implements InvocationHandler { private Object obj; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnObject = null; System.out.println("before.."); returnObject = method.invoke(obj, args); System.out.println("after.."); return returnObject; } public void bind(Object obj) { this.obj = obj; } /** * @param args */ public static void main(String[] args) { ProxyHello proxy = new ProxyHello(); //由Proxy生成代理对象在调用方法是会调用InvactionHander里面Invoke方法 IHello hello =(IHello) Proxy.newProxyInstance(Hello.class.getClassLoader(), Hello.class.getInterfaces(), proxy); proxy.bind(new Hello()); hello.sayHello(); } }
//由Proxy生成代理对象在调用方法是会调用InvactionHander里面Invoke方法这句注释是重点,测试得出结论就是用Proxy生成的代码无论是什么方法都会调用InvactionHander实现的Invoke方法,因此在调用如方法sayHello时,其实是调用InvactionHander实现Invoke的方法,并不会调用本身sayHello方法,要是我们在Invoke方法中不写对真正原方法的调用,就相当于对类的方法进行了重写,明明看到调用sayHello方法了,此时就会发现sayHello不会起作用了。因此,要实现动态代理必须要在Invoke方法中调用代理对象的真正方法
java动态代理和Proxy运用
最新推荐文章于 2024-05-11 09:57:06 发布