JDK动态代理

95 阅读1分钟

1.要代理的类一定要有接口

interface Userservice {
    void select();
    void update();
}

class UserServiceImpl implements Userservice{
	//方法返回值类型我就不写的了
    @Override
    public void select() {
        System.out.println("查询");
    }

    @Override
    public void update() {
        System.out.println("更新");
    }
}

2.通过动态代理增加UserServiceImpl中方法的功能:自定义一个handler类,实现ivocationHandler实现invoke功能即可

class UserHandler implements InvocationHandler {
    Object target;   //要代理的类

    public UserHandler(Object target) {
        this.target = target;    //通过构造函数把要代理的类注入进来
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("前面增加功能1");
        Object result = method.invoke(target, args);  //调用方法
        System.out.println("后面增加功能2");
        return result;
    }
}

3.测试

public  class test{
    public static void main(String[] args) {
        Userservice userService = new UserServiceImpl();
        ClassLoader classLoader = userService.getClass().getClassLoader();
        Class<?>[] interfaces = userService.getClass().getInterfaces();
        UserHandler userHandler = new UserHandler(userService);
        Userservice proxyInstance = (Userservice) Proxy.newProxyInstance(classLoader, interfaces, userHandler);   //三个参数
        proxyInstance.update();
        proxyInstance.select();
    }
}

4.结果

前面增加功能1
更新
后面增加功能2
前面增加功能1
查询
后面增加功能2