1.静态代理
2.动态代理
java-静态代理
1.什么是代理:如打游戏,如果要操控人物需要通过通过鼠标键盘或其他硬件方可实现人物的操作。这个硬件就属于代理 2.如何实现代理:使用extends集成基类,或通过implements 集成接口方可实现代理(类似于Spring 的AOP) 2.使用代理的好处:在不改变原内容的情况下对现有业务增加新的功能。 3.使用代理的缺点:如果要集成接口的话需要实现新增的方法,如果是多个代理的话,那么每个都需要重写新的方法 4.代码示例 4.1设置接口 public interface SaveUser { void insertUser(); } 4.2设置目标(原方法) public class MySaveUser implements SaveUser { @Override public void insertUser() { // TODO Auto-generated method stub System.out.println("原方法执行"); }}
4.3代理对象 public class ProxySaveUser implements SaveUser { private SaveUser saveUser; public ProxySaveUser(SaveUser saveUser){ this.saveUser = saveUser; } @Override public void insertUser() { // TODO Auto-generated method stub System.out.println("执行代理了 "); saveUser.insertUser(); }}
4.4测试 public static void main(String[] args) { // TODO Auto-generated method stub SaveUser saveUser = new ProxySaveUser(new MySaveUser()); saveUser.insertUser(); }Java-动态代理 1.如何实现动态代理:创建类实现InvocationHandler接口 2.代码示例 1.定义接口 /** * 动态代理 定义接口 * @author johnzhang * */ public interface School {void getSchoolName();
void getUserName(String name); } 2.实际对象 /** * 原本 的类 * @author johnzhang * */ public class Schoolimpl implements School { @Override public void getSchoolName() { System.out.println("MySchool Name IS Cheng Long"); } @Override public void getUserName(String name) { // TODO Auto-generated method stub System.out.println("您传入的姓名是" + name); } } 3.创建代理方法 public class ProxySchoolImpl implements InvocationHandler { private School school; public ProxySchoolImpl(School school){ this.school = school; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("执行代理方法啦啦啦啦啦啦!!!方法名" + method.getName() + "参数集合" ); method.invoke(school, args); System.out.println("执行代理方法完成啦啦啦啦啦啦!!!方法名" + method.getName() + "参数集合"); return null; } } 4.测试方法: public static void main(String[] args) { // 我们要代理的真实对象 School schoolimpl = new Schoolimpl(); // 我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的 schoolimpl.getSchoolName(); /* * 通过Proxy的newProxyInstance方法来创建我们的代理对象,我们来看看其三个参数 * 第一个参数 handler.getClass().getClassLoader() ,我们这里使用handler这个类的ClassLoader对象来加载我们的代理对象 * 第二个参数realSubject.getClass().getInterfaces(),我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了 * 第三个参数handler, 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上 */ InvocationHandler invocationHandler = new ProxySchoolImpl(schoolimpl); schoolimpl = (School) Proxy.newProxyInstance(invocationHandler.getClass().getClassLoader(),schoolimpl.getClass().getInterfaces(),invocationHandler); schoolimpl.getSchoolName(); System.out.println("==========================================="); schoolimpl.getUserName("Li Ming"); }