一、Java实现动态代理

1、创建接口

package com.oyy.mw.biz.i;

public interface Cal {

    public int add(int num1,int num2);
public int sub(int num1,int num2);
public int mul(int num1,int num2);
public int div(int num1,int num2); }

2、创建实现类

package com.oyy.mw.biz;

import com.oyy.mw.biz.i.Cal;

public class CalImpl implements Cal{

    public int add(int num1, int num2) {
int result = num1+num2;
return result;
} public int sub(int num1, int num2) {
int result = num1-num2;
return result;
} public int mul(int num1, int num2) {
int result = num1*num2;
return result;
} public int div(int num1, int num2) {
int result = num1/num2;
return result;
} }

3、创建Java动态代理实现类

package com.oyy.mw.biz;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays; public class MyInvocationHandler implements InvocationHandler { Object obj = null; /**
* @param obj 接受传入的真实对象
* @return 返回代理对象
*/
public Object bind(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
this);
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(method.getName()+"的参数是:"+Arrays.toString(args));
//调用方法,返回该方法返回的结果
Object result = method.invoke(obj, args);
System.out.println(method.getName()+"的结果是:"+result); return result;
} }

4、测试动态代理

package com.oyy.mw.test;

import com.oyy.mw.biz.CalImpl;
import com.oyy.mw.biz.MyInvocationHandler;
import com.oyy.mw.biz.i.Cal; public class Test {
public static void main(String[] args) {
Cal cal1 = new CalImpl();
MyInvocationHandler handler = new MyInvocationHandler();
Cal cal = (Cal)handler.bind(cal1);
cal.add(10, 3); cal.sub(10, 3);
cal.mul(10, 3);
cal.div(10, 3);
}
}

5、打印结果

二、spring实现动态代理(AOP)

  1、创建接口

package com.oyy.mw.aspects.i;

public interface Cal {

    public int add(int num1,int num2);
public int sub(int num1,int num2);
public int mul(int num1,int num2);
public int div(int num1,int num2); }

  2、创建实现类

package com.oyy.mw.aspects;

import org.springframework.stereotype.Component;

import com.oyy.mw.aspects.i.Cal;

@Component
public class CalImpl implements Cal{ public int add(int num1, int num2) {
int result = num1+num2;
return result;
} public int sub(int num1, int num2) {
int result = num1-num2;
return result;
} public int mul(int num1, int num2) {
int result = num1*num2;
return result;
} public int div(int num1, int num2) {
int result = num1/num2;
return result;
} }

  3、配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="com.oyy.mw.aspects"></context:component-scan> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

  4、spring切面的实现

package com.oyy.mw.aspects;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component; @Aspect
@Component
public class LoggerAspect { @Before("execution(public int com.oyy.mw.aspects.CalImpl.*(..))")
public void before(JoinPoint joinPoint){
//获取方法名
String name = joinPoint.getSignature().getName();
//获取参数列表
String args = Arrays.toString(joinPoint.getArgs());
System.out.println(name+"的参数是:"+args);
} @After("execution(public int com.oyy.mw.aspects.CalImpl.*(..))")
public void after(JoinPoint joinPoint){
//获取方法名
String name = joinPoint.getSignature().getName();
System.out.println(name+"方法结束");
} @AfterReturning(value="execution(public int com.oyy.mw.aspects.CalImpl.*(..))",returning="result")
public void afterReturn(JoinPoint joinPoint,Object result){
//获取方法名
String name = joinPoint.getSignature().getName();
System.out.println(name+"方法的结果是"+result);
} @AfterThrowing(value="execution(public int com.oyy.mw.aspects.CalImpl.*(..))",throwing="ex")
public void afterThrowing(JoinPoint joinPoint,Exception ex){
//获取方法名
String name = joinPoint.getSignature().getName();
System.out.println(name+"方法抛出异常:"+ex);
} }

  5、测试类

package com.oyy.mw.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.oyy.mw.aspects.CalImpl;
import com.oyy.mw.aspects.MyInvocationHandler;
import com.oyy.mw.aspects.i.Cal; public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Cal cal = (Cal)context.getBean("calImpl");
cal.div(10, 2);
}
}

  6、运行结果

实现动态代理(Java和spring)的更多相关文章

  1. CgLib动态代理学习【Spring AOP基础之一】

    如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发 ...

  2. 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。

    基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...

  3. Spring -- <tx:annotation-driven>注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)的区别。

    借鉴:http://jinnianshilongnian.iteye.com/blog/1508018 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional ...

  4. [转]JAVA的动态代理机制及Spring的实现方式

    JAVA 代理实现 代理的实现分动态代理和静态代理,静态代理的实现是对已经生成了的JAVA类进行封装. 动态代理则是在运行时生成了相关代理累,在JAVA中生成动态代理一般有两种方式. JDK自带实现方 ...

  5. Java动态代理学习【Spring AOP基础之一】

    Spring AOP使用的其中一个底层技术就是Java的动态代理技术.Java的动态代理技术主要围绕两个类进行的 java.lang.reflect.InvocationHandler java.la ...

  6. 动态代理以及对应Spring中AOP源码分析

    AOP(面向切面编程)在Spring中是被广泛应用的(例如日志,事务,权限等),而它的基本原理便是动态代理. 我们知道动态代理有两种:基于JDK的动态代理以及基于CGlib动态代理.以下是两种动态代理 ...

  7. java --- 设计模式 --- 动态代理

    Java设计模式——动态代理 java提供了动态代理的对象,本文主要探究它的实现, 动态代理是AOP(面向切面编程, Aspect Oriented Programming)的基础实现方式, 动态代理 ...

  8. Java动态代理机制——JDK

    动态代理机制是Spring AOP编程的原理基础. JDK的动态代理机制有个限制就是它只能代理实现了一个或多个接口的类.如PersonImpl得实现Person接口,才能用JDK动态代理机制. 定义一 ...

  9. Spring AOP中的动态代理

    0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1  ...

  10. Spring AOP动态代理原理与实现方式

    AOP:面向切面.面向方面.面向接口是一种横切技术横切技术运用:1.事务管理: (1)数据库事务:(2)编程事务(3)声明事物:Spring AOP-->声明事物   2.日志处理:3.安全验证 ...

随机推荐

  1. 【算法笔记】B1003 我要通过!

    1003 我要通过! (20 分) “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案 ...

  2. Oracle之AUTHID CURRENT_USER

    没有AUTHID CURRENT_USER表示定义者权限(definer rights),以定义者身份执行: 加上AUTHID CURRENT_USER表示调用者权限(invoker rights), ...

  3. 【总结】ettercap工具之DNS劫持

    在arp欺骗成功基础上开始进行dns劫持,,, 1.修改/etc/ettercap/etter.dns文件内容,如下图所示. 将所有域名解析到192.168.1.250地址上,,, 2.etterca ...

  4. python练习六十九:urllib爬取练习

    爬取图片,将链接中的图片取出来,并统计一共下载了多少图片 代码: def fetch_pictures(url): headers = {'User-Agent':'Mozilla/5.0 (Wind ...

  5. jquery 去除字符串左右空格

    /*** 删除左右两端的空格*/String.prototype.trim=function(){return this.replace(/(^\s*)|(\s*$)/g, '');} 调用方式: v ...

  6. RedisClient 连接redis 提示 ERR Client sent AUTH, but no password is set

  7. linux 运维基础之VM中安装centos6.X

    VM中安装centos详细教程 图片讲解:

  8. java url生成二维码保存到本地

    http://blog.sina.com.cn/s/blog_5a6efa330102v1lb.html http://blog.csdn.net/about58238/article/details ...

  9. fabric 自动创建仓库并下载或更新代码

    #!/usr/bin/python # -*- coding: utf-8 -* from fabric.api import * from fabric.contrib.files import * ...

  10. Design Pattern理解碎片

    开发封闭原则(Open-Closed Principle OCP)Software entities(classes,modules,functions etc) should open for ex ...