- 浏览: 116534 次
- 性别:
- 来自: 广西
-
文章分类
最新评论
-
greemqqran:
这方法 源码,是怎么的哦?
可变参数,数组与集合之间的转换 -
greemqqran:
Arrays.asList
可变参数,数组与集合之间的转换 -
ricoyu:
引用? super E:接收的是E类型对象应该是: ? sup ...
泛型-
package com.dhcool.proxy; import java.lang.reflect.Method; /** * 这个类是用于给动态代理类调用的类,实现这个类就可以让代理类为我们调用 * */ public interface Advise { void beforeMethod(Method method); void afterMethod(Method method); }
package com.dhcool.proxy; import java.lang.reflect.Method; /** * 实现自己的Advise然后实现相应的方法 * */ public class MyAdvise implements Advise{ @Override public void beforeMethod(Method method) { System.out.println("beforeMethod"); } @Override public void afterMethod(Method method) { System.out.println("afterMethod"); } }
package com.dhcool.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 这个类继承Proxy动态代理,当我们创建一个MyProxy的时候要给构造方法传递一个我们自己的 调用处理器 InvocationHandler * 这个类中还有可以设置目标类(实现接口的类),建议添加的内容Advise * * Proxy能够动态的获取一个实现接口的代理类,当我们调用Proxy的Proxy.newProxyInstance(loader, interfaces, h)方法的时候,我们要传递过去的有 * 1.一个类加载器(反射获得目标对象的类加载器:target.getClass().getClassLoader()) * 2.具体实现类的接口Class[]数组集合(我们可以通过反射获得,target.getClass.getInterfaces()) * 3.一个 调用控制器(InvocationHandler)这个类我们必须要自己实现,因为当我们获取了一个实例代理类之后,就可以去调用该类相应的方法,而这个调用过程就在 * 实例代理类中是这样实现的:比如我们的target类有一个方法叫add();在实例代理类中也会有一个方法叫做add();并且是Proxy帮我们已经实现好了的,方法的内容是这样的 * InvocationHandler实例对象去调用invoke(Object proxy, Method method, Object[] args),也就是我们初始化的invoke(Object proxy, Method method, Object[] args) * 这个过程中会把Proxy实例代理类,调用具体的方法mehod,调用时的参数Object[] args传递过去。 * *了解了以上的过程,我们需要做的就是去实现这个InvocationHandler,实现invoke方法,在invoke方法中就可以是实现我们的target的调用,也就是method.invoke(target,args); *这样就一个过程就是动态代理过程。 * */ public class MyProxy { private static final long serialVersionUID = 1L; private InvocationHandler handler = null; private Advise advise; private Object target; public MyProxy(){} protected MyProxy(InvocationHandler h) { this.handler = h; } //设置建议内容 public void setAdvise(Advise advise){ this.advise = advise; } //设置目标类 public void setTarget(Object target){ this.target = target; } //设置 调用处理器 public void setInvocationHander(InvocationHandler h ){ this.handler = h; } //获取动态代理类,返回的是一个对象Object类型,我们可以根据需要进行转换为相应的类 private Object getProxy(final Advise advise, final Object target) { if(this.target == null){ return null; } if(this.handler == null){ if(this.advise == null){ return null; } return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { advise.beforeMethod(method); Object returnValue = method.invoke(target, args); advise.afterMethod(method); return returnValue; } }); }else{ return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this.handler); } } public Object getProxy(){ return this.getProxy(this.advise, this.target); } }
package com.dhcool.proxy; import java.lang.annotation.Target; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collection; public class ProxyTest { public static void main(String[] args) { //final Advise advise = new MyAdvise(); final Advise advise2 = new MyAdvise2(); //final Collection<String> target = new ArrayList<String>(); /*MyProxy myProxy1 = new MyProxy(new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { advise.beforeMethod(method); advise.beforeMethod(method); advise.afterMethod(method); System.out.println("OK"); return method.invoke(target, args); } }); myProxy1.setTarget(target); @SuppressWarnings("unchecked") Collection<String> c = (Collection<String>)myProxy1.getProxy(); if(c == null){ System.out.println("数据不足不能获取代理对象"); return; } c.add("123"); System.out.println(c.size());*/ /*MyProxy myProxy = new MyProxy(); myProxy.setAdvise(advise); myProxy.setTarget(target); @SuppressWarnings("unchecked") Collection<String> c2 = (Collection<String>)myProxy.getProxy(); if(c2 == null){ System.out.println("数据不足不能获取代理对象"); return; } c2.add("123"); System.out.println(c2.size()); */ //创建代理 MyProxy myProxy2 = new MyProxy(); //设置代理的附加建议代码 myProxy2.setAdvise(advise2); //设置代理的实现目标接口 final MyInterfaces interfaces = new InterfaceImp(); myProxy2.setTarget(interfaces); //获取动态代理类 MyInterfaces inter = (MyInterfaces)myProxy2.getProxy(); inter.add(); /*final MyInterfaces interfaces = new InterfaceImp(); //final Collection interfaces = new ArrayList(); Class[] clazz = interfaces.getClass().getInterfaces(); for (Class class1 : clazz) { System.out.println(class1.getName()); } MyInterfaces a = (MyInterfaces)Proxy.newProxyInstance(interfaces.getClass().getClassLoader(), interfaces.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { advise2.afterMethod(method); return method.invoke(interfaces, args); } }); System.out.println(a.delete());*/ } }
package com.dhcool.proxy; public interface MyInterfaces { public void add(); public int delete(); public void update(); }
package com.dhcool.proxy; public class InterfaceImp implements MyInterfaces { @Override public void add() { System.out.println("增加"); } @Override public int delete() { return 1; } @Override public void update() { System.out.println("更新"); } }
发表评论
-
动态代理+注解实现用户权限控制
2012-12-23 00:01 1283首先第一步我们需要定义一个接口UserDao p ... -
JDK动态代理模式
2012-12-22 21:51 884package cn.dhcool.dynamic.proxy ... -
代理proxy模式
2012-12-22 20:45 0静态代理模式: 需要有一个公共的借口,还有一个真实的实现类, ... -
工厂模式下出现的问题-null异常
2012-12-15 18:31 895遇到了一个问题: public class Dao ... -
内部类详解
2011-12-09 21:23 613从Java1.1开始引入了内部类以来,它就引起了人们的激烈争论 ... -
内省总结
2011-11-19 02:43 793package com.dhcool.introspec ... -
线程锁
2011-10-10 13:27 801sleep(), wait(),yield(),这3个方法,s ... -
类似百度谷歌分页算法实现
2011-09-08 15:58 1554<%@ page language="j ... -
充当服务端代码
2011-08-05 16:53 654import java.net.*; import java ... -
获取文件中邮件的示例
2011-08-05 12:25 720import java.util.regex.*; impo ... -
正则表达式常用字符
2011-08-05 12:22 842构造 匹配 字符 x 字符 x ... -
正则表达式
2011-08-05 12:16 793第一种:1.定义匹配规则如:String qqreg = &q ... -
InetAddress
2011-08-04 21:59 876import java.net.*; class Inet ... -
B/S socket
2011-08-04 21:08 1015import java.net.*; import java ... -
TCP多线程文件上传
2011-08-04 14:51 868/* 上传图片 */ import java.io.*; ... -
网络编程基础
2011-08-04 14:25 812网络编程: 网络通讯中所需要了解的一些内容。 T ... -
一道题
2011-08-02 21:05 591/* 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据 ... -
TCP
2011-08-02 20:46 739import java.net.*; import ja ... -
UDP
2011-08-02 20:35 837import java.net.*; import java ... -
mypad小程序
2011-08-02 15:48 709package menupack; import jav ...
相关推荐
在学习和应用IOC框架,尤其是通过动态代理实现时,我们需要了解以下知识点: 1. IOC的基本原理和实现机制,包括依赖注入(Dependency Injection)的概念。 2. 如何配置IOC容器,如XML配置或注解配置。 3. 如何使用...
Java动态代理实现AOP Java动态代理是实现Aspect Oriented Programming(AOP)的重要手段。在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想...
以下是一个简单的示例,展示如何使用动态代理实现数据库连接池: 1. 定义数据库连接池参数类(如`DBPoolConfig`),存储JDBC驱动类名、URL、用户名和密码等信息,用于初始化连接池。 ```java public class ...
本文将由浅入深地分析 MyBatis 如何通过动态代理实现拦截器的原理。 首先,我们需要了解动态代理的概念。在 Java 中,动态代理是通过 `java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口...
动态代理是实现AOP的一种常见手段,尤其在Java中应用广泛。 动态代理主要分为JDK动态代理和CGLIB动态代理两种方式: 1. **JDK动态代理**: JDK动态代理基于接口实现,它通过`java.lang.reflect.Proxy`类和`java....
以下是一个简单的例子,展示了如何使用Java动态代理实现AOP: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface MyInterface {...
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...
术解决在软件开发中OOP难以解决的问题以及提高开发效率,利用JAVA的反射机制,研究了AOP的动态代理实现原 理,说明了其可行性,体现了AOP技术应用价值和发展前景。 关键词:AOP;动态代理;横切关注点
- 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想购买法国某个牌子的香水...
但是,理解如何通过动态代理实现数据源连接池可以帮助我们更好地理解这种机制,并且在某些特定场景下,自定义实现可能会更加灵活。 首先,我们需要了解`InvocationHandler`接口。这个接口只有一个方法`invoke()`,...
这里我们将深入探讨Java中的两种主要动态代理实现:JDK动态代理和CGLIB动态代理,以及静态代理作为基础概念的介绍。 首先,我们来看静态代理。静态代理是代理模式的一种实现方式,它要求我们为每个目标接口创建一个...
下面我们将详细探讨如何使用Java动态代理实现委托模式,以及相关的源码和工具应用。 首先,理解委托模式的基本概念。委托模式通常由三部分组成:委托者(Delegate)、被委托者(Subject)和客户端(Client)。委托...
动态代理实现aop
标题中提到的"java-用Java动态代理实现AOP"是介绍如何使用Java内置的动态代理机制来实现AOP的一个教程。Java动态代理在JDK 1.2及更高版本中引入,主要通过`java.lang.reflect.Proxy`和`java.lang.reflect....
java动态代理实现数据库连接池的详细原理讲解
本篇文章将探讨如何通过JDK动态代理实现Spring AOP的基础知识。 首先,我们要理解什么是JDK动态代理。在Java中,动态代理机制允许我们在运行时创建一个实现了特定接口的新类。这个新类的实例可以代理目标对象,执行...