代码改变世界

java内置接口动态代理

2018-10-17 16:39  人月神话。  阅读(526)  评论(0)    收藏  举报

package
动态代理; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 实现InvocationHandler * @author lzq * @version 1.0 * @tags * @date 2018年10月17日 */ public class MyInvocationHandler implements InvocationHandler{ private Object target; public MyInvocationHandler( Object target) {//在代理类中创建构造方法让用户传入要代理的对象 this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("权限校验"); method.invoke(target, args);//通过反射调用方法 System.out.println("日志记录"); return null; } }

 

package 动态代理;

public interface User {
    public void add();
    public void delete();
}

 

 

package 动态代理;

public class UserImpl implements User {

    @Override
    public void add() {
        System.out.println("添加成功");
        
    }

    @Override
    public void delete() {
        System.out.println("删除成功");
        
    }

}

 

 

测试类:

package 动态代理;

import java.lang.reflect.Proxy;

public class Test {

    public static void main(String[] args) {
        UserImpl userimp = new UserImpl();
        MyInvocationHandler my = new MyInvocationHandler(userimp);//自定义的代理类
        //使用Proxy.newProxyInstance 方法创建代理          //获取到了类加载器
        User u = (User) Proxy.newProxyInstance(userimp.getClass().getClassLoader(), 
            //获取到 该实现类实现的所有接口    
            userimp.getClass().getInterfaces(),my);
        u.add();
        u.delete();
        
    }

}