代理模式是基础的代理模式之一。经常使用的AOP,日志都是代理模式现象的。在不改变原来的类或者方法的前提下,对外提供增值服务。java
java 实现代理的方式ide
1)代理分静态代理,测试
2)jdk动态代理,this
3)Cglib动态代理。spa
静态代理实现方式代理
代码静态代理,主要经过继承相同的接口,日志
java jdk 动态代理实现方式code
java jdk 动态代理。主要是实现 InvocationHandler 接口便可对象
举个例子blog
package proxy; /** * @author ZHONGZHENG664 * @date 2018/8/31. */
public interface User { void getNmae(); void getAge(); /** * 获取工资 * @return
*/
int getSarly(int month); }
实现类
package proxy; /** * @author ZHONGZHENG664 * @date 2018/8/31. */
public class RealUser implements User { public void getNmae() { System.out.println("my name is xiaoming"); } public void getAge() { System.out.println("my age is 14"); } public int getSarly(int month) { return month+200; } }
代理实现:增长日志
package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * @author ZHONGZHENG664 * @date 2018/8/31. */
public class DynamicProxy implements InvocationHandler { private Object user; public DynamicProxy(Object user) { this.user = user; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before rent house"); System.out.println("Method:" + method); // 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
method.invoke(user, args); // 在代理真实对象后咱们也能够添加一些本身的操做
System.out.println("after rent house"); return null; } }
测试类:
package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * @author ZHONGZHENG664 * @date 2018/8/31. */
public class TestProxy { public static void main(String[] gars) { RealUser realUser = new RealUser(); DynamicProxy dynamicProxy = new DynamicProxy(realUser); User user = (User) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(), realUser.getClass().getInterfaces(), dynamicProxy); System.out.println(user.getClass().getName()); user.getAge(); user.getNmae(); System.out.println("my sarly:"+user.getSarly(80)); } }