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
- JDK的动态代理特性
- JDK的动态代理
- JDK的动态代理
- JDK的动态代理
- JDK的动态代理
- JDK的动态代理
- Jdk的动态代理
- JDK的动态代理机制
- JDK的动态代理机制
- JDK的动态代理原理
- JDK的动态代理机制
- JDK的动态代理机制
- JDK的动态代理机制
- jdk动态代理的实现
- JDK的动态代理机制
- Aop的jdk动态代理
- JDK的动态代理机制
- JDK的动态代理机制
- ubuntu下安装lxml依赖出错解决方法
- Ant BUILD FAILED The following error occurred while executing this line: xxx 解决方案
- 使用VC6.0实现窗口的任意分割
- iOS 动画
- 使用物化视图和查询重写功能
- JDK的动态代理特性
- NSRunLoop
- 与你,预约一个来生的相逢
- 黑马程序员------面向对象
- ReportStudio入门教程(二十) - 值提示的自动提交
- Visual Studio debug 模式和 release 模式
- leetcode:Sort List
- 设计的成长
- java中的断点下载文件