java 动态代理

  代理模式是基础的代理模式之一。常用的AOP,日志都是代理模式现象的。在不改变原来的类或者方法的前提下,对外提供增值服务。

java 实现代理的方式

  1)代理分静态代理,

  2)jdk动态代理,

  3)Cglib动态代理。

静态代理实现方式

  代码静态代理,主要通过继承相同的接口

java jdk 动态代理实现方式

  java jdk 动态代理。主要是实现 InvocationHandler 接口即可

举个例子

package proxy;

/**
 * @author ZHONGZHENG664
 * @date 2018/8/31.
 */
public interface User {
    void getNmae();
    void getAge();

    /**
     * 获取工资
     * @return
     */
    int getSarly(int month);
}
View Code

实现类

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;
    }
}
View Code

代理实现:增加日志

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;
    }
}
View Code

 

测试类:

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));
    }
}
View Code

 

 

 

posted @ 2018-09-03 15:42  钟政123  阅读(129)  评论(0编辑  收藏  举报