在上篇博客中讨论到java的静态代理, 就是通过组合的方法,前提是委托类需要实现一个接口,代理类也实现这个这个 接口,从何组合两个类,让代理类给委托类添加功能!

知道java的静态代理,我们又遇到一个问题,我们又遇到一个问题,是不是每个类要添加功能,都得重新写个类呢!怎么才能实现同样的代码,可以在其他类都能起作用!

这就是java动态代理的内容,在java中通Proxy类好AnnotationHandler接口来实现动态代理,我先尝试自己写一个自己的动态代理!

一.实现简单的自定义动态代(没考虑参数,接口) 只能称之为     伪java动态代理

1、接口:

public interface ICommonInterface {
//nothing
public void addUser();
public void delete();
}

2、需要代理的类(委托类)

/*
* 自定义java动态代理
* 这是一个委托类
*/
public class DelegationClass implements ICommonInterface { public void addUser()
{
System.out.println("add user success");
} public void delete()
{
System.out.println("delete user success");
} }

3.代理类

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class ProxyClass { //定义委托类对象(组合对象)
private Object target=null;
public ProxyClass(Object target)
{
this.target=target; //构造方法初始化委托对象实例
} public void invokeFunction(Method m) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
System.out.println("before start.....");
m.invoke(target);
} }

4.测试类

import java.lang.reflect.InvocationTargetException;

public class Test {
public static void main(String [] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException
{
//获取委托对象
DelegationClass target=new DelegationClass();
//获取代理对象
ProxyClass pro=new ProxyClass(target);
//传递委托对象调用方法,调用代理对象对应的方法实现
pro.invokeFunction(target.getClass().getMethod("addUser"));
pro.invokeFunction(target.getClass().getMethod("delete"));
}
} 结果:
before start.....
add user success
before start.....
delete user success

我们可以看到实现的简单代理类,代理类没有涉及到接口,也没涉及到参数传递.....这些条件导致这个代理很好实现,现实中,我们得考虑接口,考虑参数 !


我们来看看java怎么实现动态代理的:

java中有两个类:InvocationHandler 和Proxy  其中Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现

我们来看看实例:

业务接口:

public interface ICommonInterface {
//nothing
public void addUser();
public void delete();
}

业务接口实现:

public class DelegationClass implements ICommonInterface {

	public  void addUser()
{
System.out.println("add user success");
} public void delete()
{
System.out.println("delete user success");
} }

InvocationHandler实现,需要在接口方法调用前加入一部分其他逻辑

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Interceptor implements InvocationHandler { //声明一个委托类的对象
private Object target=null;
public Interceptor(Object target)
{
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
doBefore();
method.invoke(target, args);
return null;
}
public void doBefore()
{
System.out.println("start ...............");
} }

测试类:

public class Test {
public static void main(String [] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException
{
//获取委托对象
DelegationClass target=new DelegationClass();
//获取InvocationHanlder的实例对象
Interceptor inter=new Interceptor(target);
//获取代理对象(实际上Proxy根据target的类加载器,接口和InvocationHandle生成一个类,再生成一个对象)
ICommonInterface de= (ICommonInterface) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), inter);
//测试这个对象
System.out.println(de.getClass().getInterfaces()[0].getName());
de.addUser();
de.delete();
}
}

结果:

com.test.proxy.javaproxy.ICommonInterface
start ...............
add user success
start ...............
delete user success

如何实现在已有代码之后添加逻辑之java动态代理的更多相关文章

  1. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...

  2. java动态代理实现与原理详细分析(代码层面解释了AOP的实现)

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式, ...

  3. java 动态代理(模式) InvocationHandler(为类中方法执行前或后添加内容)

    动态代理属于Java反射的一种. 当我们得到一个对象,想动态的为其一些方法每次被调用前后追加一些操作时,我们将会用到java动态代理. 下边上代码: 首先定义一个接口: package com.liu ...

  4. Java动态代理代码快速上手

    动态代理的两个核心的点是:代理的行为 和 代理机构. 举个例子,上大学的时候,很多同学吃午饭的时候都是叫别人带饭,有一个人H特别热心肠,想了一个办法,他在门口挂了个公示牌,每天有谁想要找人带饭就写公告 ...

  5. Java动态代码模式

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委 ...

  6. Java JDK 动态代理实现和代码分析

    JDK 动态代理 内容 一.动态代理解析 1. 代理模式 2. 为什么要使用动态代理 3. JDK 动态代理简单结构图 4. JDK 动态代理实现步骤 5. JDK 动态代理 API 5.1 java ...

  7. 代码中添加事务控制 VS(数据库存储过程+事务) 保证数据的完整性与一致性

    做人事档案的系统考虑到数据的安全性与一致性,毕竟是要对外上线.真正投入使用的项目,数据库的可靠性与安全性上我们开发人员要考虑的就很多了,记得做机房收费系统时注册新卡是自己为了简单,写成了一个存储过程( ...

  8. 【学习总结】【Java】Git学习-上传本地已有代码到GitHub

    < Git学成归来后的第一次实战 > 上传本地已有代码到GitHub 以之前学了一小半的Java基础教程代码为例 <深坑预警:在GitHub新建仓库那一步,不要勾选readme,不然 ...

  9. Lc.exe已退出,代码为-1

    编译项目,出现提示"Lc.exe已退出,代码为-1" .   解决办法: 意思就是把licenses.licx这个文件里的内容删除,但是文件还在(此时是个空文件),发生这个问题的原 ...

随机推荐

  1. Scala学习笔记(六):Scala程序

    想要编写能够独立运行的Scala程序,就必须创建有main方法(仅带一个参数Array[String],且结果类型为Unit)的单例对象. 任何拥有合适签名的main方法的单例对象都可以用来作为程序的 ...

  2. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  3. Git.Framework 框架随手记--ORM项目工程

    前面已经简单介绍过了该框架(不一定是框架),本文开始重点记录其使用过程.可能记录的内容不是太详尽,框架也可能非常烂,但是里面的代码句句是实战项目所得.本文非教唆之类的文章,也非批判之类的文章,更不是炫 ...

  4. “未能加载文件或程序集“EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”

    产生原因: 使用nuget管理程序包,同一个解决方案里面有不同版本的Entity Framework,有可能在不同时间安装不同版本的Entity Framework,所以出现这个问题. 解决方案: 1 ...

  5. JS函数表达式

    导图

  6. php中curl的详细解说

    cURL可以使用URL的语法模拟浏览器来传输数据, 因为它是模拟浏览器,因此它同样支持多种协议, FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE ...

  7. 英语etc怎么发音、单词来历

    etc是等等的意思,与and so on 相同 音标/et'set(a)ra/ 源于法语et cetera,也是等等的意思 在计算机操作系统目录(linux和windows)有一个叫etc的目录 里面 ...

  8. [转]Oracle中存储过程和函数的区别

    原文地址:http://blog.csdn.net/tender001/article/details/8066203 存储过程和函数: 例子: //创建过程 create or replace pr ...

  9. [Asp.net mvc] Asp.net mvc Kendo UI Grid的使用(四)

    有段时间没写博客了,工作状态比较忙,抽空继续总结下Grid的使用,这次主要介绍模板以及其他官网介绍不详尽的使用方法.先Show出数据,然后讲解下.后台代码: public ActionResult O ...

  10. Java 集合类详解(含类图)

    0.参考文献 此图中蓝色为抽象类.深红色表示接口(Arrays除外).绿色表示具体容器类 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比如ArrayList,LinkedLi ...