动态代理模式主要由四个元素共同构成:
1. 接口,接口中的方法是要真正去实现的
2. 被代理类,实现上述接口,这是真正去执行接口中方法的类
3. 代理类,实现InvocationHandler,帮助被代理类去实现方法
4. 测试用例:
代码示例
- 接口:
public interface Person { void searchHouse(); }
- 被代理类Master,实现上述接口:
public class Master implements Person { void searchHouse(){ System.out.println("I'm Mater."); }; }
- 代理类HomeLine,实现InvocationHandler接口
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class HomeLink implements InvocationHandler{ private Person target; public Object getInstance(Person target){ this.target = target; Class clazz = target.getClass(); return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this); } @Override public Object invoke(Object obj, Method method, Object[] args) throws Throwable { System.out.println("HomeLink Start..."); //第一个参数是target,也就是被代理类的对象;第二个参数是方法中的参数 method.invoke(target, args); System.out.println("HomeLink End..."); return null; } }
4.测试用例:
public class TestSearchHouse { public static void main(String[] args) { Person person = (Person) new HomeLink().getInstance(new Master()); person.searchHouse(); } }
- 运行结果如下:
HomeLink Start…
I’m Mater.
HomeLink End…
使用
通过动态代理,可以拦截到未知类的方法调用。
参考文献