JDK动态代理

来源:互联网 发布:linux wps字体库下载 编辑:程序博客网 时间:2024/06/03 06:44

JDK动态代理

使用jdk的动态代理可以为所有实现了接口的对象做代理,如list集合,数据库操作。。
如我们自己创建一个接口实现代理模式

package dynamic;public interface Login{    String login(String name);}
package dynamic;public class LoginImpl implements Login {    @Override    public String login(String name) {        System.out.println("登录");        return name;    }}
package dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.util.Arrays;// jdk动态代理,可为任何实现了接口的类做代理public class InvocationHandlerImpl implements InvocationHandler {    // 被代理的真实角色    private Object obj;    public InvocationHandlerImpl (Object obj) {        this.obj = obj;    }    /**     *     * @param proxy 无解     * @param method 被代理的对象接口的方法     * @param args 该方法的参数     * @return 返回该方法的返回值     * @throws Throwable t     */    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println(method);        System.out.println(Arrays.toString(args));        Object invoke = method.invoke(obj, args);        System.out.println(invoke);        return invoke;    }}

// 调用

package dynamic;import java.lang.reflect.Proxy;public class Client {    public static void main(String[] args) {        // 创建被代理的接口实现类的对象        LoginImpl login = new LoginImpl();        // 创建代理对象 不能是直接new,只能返回接口类,不能返回实现类        Login l = (Login) Proxy.newProxyInstance(login.getClass().getClassLoader(), login.getClass().getInterfaces(), new InvocationHandlerImpl(login));        String name = l.hire("登录前处理");        System.out.println(name);    }}