JDK的动态代理特性

来源:互联网 发布:信贷员靠谱抢单软件 编辑:程序博客网 时间:2024/05/19 04:56
        在JDK1.3以上版本,实现了动态代理模式。通过JDK的动态代理特性,可以为任意java对象创建代理对象,对于具体使用来说,这个特性是通过java Reflection API 来完成的。

Proxy原理:
        Proxy的调用过程中,如果客户(Client)调用Proxy的request方法,会在调用目标对象的request方法的前后调用一系列的处理,而这些一系列的处理相对于目标对象来说是透明的,目标对象对这些处理可以毫不知情,这就是Proxy模式。

        JDK中的proxy代理需要实现InvocationHandler接口。
        
            三个参数解析:
                        1.代理对象实例
                        2.method方法对象,代表的是当前Proxy被调用的方法
                        3.被调用的方法中的参数



jdk动态代理实现,实现InvocationHandler  接口,代码如下:

jdk的动态代理是基于接口模式下的代理。
        步骤:
                1.定义接口,如下实例:
                        public interface UserManagement {

                            void addUser(String name,int age);
                            String deleteUser(String...str);
                        }
                2.接口类的实现。如下代码:
                        import com.yc.jdk.proxy.UserManagement;

                        public class UserManagementImpl implements UserManagement {

                     public void addUser(String name, int age) {
                        System.out.println("add");
                     }

                            public String deleteUser(String... str) {
                        System.out.println("delete");
                         return "delete";
                     }

                        }
                3.继承jdk中的代理类InvocationHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class CheckSecurity implements InvocationHandler {

//声明目标类
private Object targetObject;

/**
* 传入要代理的对象
* @param targetObject
* @return object
*/
public Object CheckSecurity(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(), this);

}

//模拟 环绕代理方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
checkseiurity();
Object chckObject = null;
// 获取方法名称
p("method name value ", method.getName());
// 取得此方法是不是可变参数
p("method is var args ", method.isVarArgs());
System.out.println(args.length);

try {
chckObject = method.invoke(this.targetObject, args);
} catch (RuntimeException e) {
e.printStackTrace();
}
checkseiurity();
return chckObject;
}

private void checkseiurity() {
System.out.println("--------------check----------------");
}

public void p(Object... object) {
for (int i = 0; i < object.length; i++) {
System.out.print(object[i].toString());
}
// 产生换行
System.out.println();
}
}
4.测试jdk动态代理
import java.lang.reflect.Proxy;

import com.yc.jdk.proxy.impl.UserManagementImpl;

public class JdkPorxy {
public static void main(String[] args) throws Exception {
CheckSecurity checkSecurity = new CheckSecurity();

UserManagement management = (UserManagement) checkSecurity
.CheckSecurity(new UserManagementImpl());

p(Proxy.isProxyClass(UserManagement.class));

// management.addUser("张三", 12);

management.deleteUser("张三", "李四", "王五", "赵六");
}

public static void p(Object object) {
System.out.println(object.toString());
}
}


运行结果:
false
--------------check----------------
method name value deleteUser
method is var args true
1
delete
--------------check----------------


0 0