动态代理机制是Spring AOP编程的原理基础。

JDK的动态代理机制有个限制就是它只能代理实现了一个或多个接口的类。如PersonImpl得实现Person接口,才能用JDK动态代理机制。

定义一个Person的接口:

package wang.dao;

public interface Person {

	public void eat();
public void sleep(); }

定义接口Person的实现类,类的实例就是我们要代理的对象(被代理的对象)

package wang.dao.impl;

import wang.dao.Person;

public class PersonImpl implements Person{

	@Override
public void eat() { System.out.println("吃的方法。。。");
} @Override
public void sleep() { System.out.println("睡的方法。。。");
} }  

定义代理处理类。其中主要有以下几点。

1.实现InvocationHandler接口。

2.定义被代理的对象;

3.定义一个方法,将被代理的对象和处理器的实例(this)关联;

4.调用被代理对象的方法。

package wang.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import com.sun.org.apache.bcel.internal.generic.ReturnaddressType; public class MyProxy implements InvocationHandler {
//2.定义被代理的对象
private Object person;
//3.定义一个方法,将被代理的对象和处理器实例(this)关联。
public Object bind(Object person)
{
this.person = person;
return Proxy.newProxyInstance(this.getClass().getClassLoader(), person.getClass().getInterfaces(),this); } @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理前"); //4.调用被代理对象的方法。
method.invoke(person, args); System.out.println("代理后");
return null;
} }
package wang.test;

import wang.dao.Person;
import wang.dao.impl.PersonImpl;
import wang.proxy.MyProxy; public class ProxyTest { /**
* @param args
*/
public static void main(String[] args) { Person person = new PersonImpl();//被代理的对象
MyProxy proxy = new MyProxy();
person = (Person) proxy.bind(person);//
person.eat();
person.sleep(); } }

Java动态代理机制——JDK的更多相关文章

  1. [转]java动态代理(JDK和cglib)

    转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理 ...

  2. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

  3. 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解

    代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...

  4. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  5. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  6. [转]Java 动态代理机制分析及扩展

    引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  7. java动态代理机制

    首先了解代理设计模式,其思想是为其他对象提供一种代理以控制对这个对象的访问. java动态代理就是遵循这种思想,spring中的AOP实现原理就是java的动态代理. 在java的动态代理机制中,有两 ...

  8. Java 动态代理机制分析及扩展--转

    http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/#icomments http://www.ibm.com/developerworks/c ...

  9. Java 动态代理机制分析及扩展,第 1 部分

    Java 动态代理机制分析及扩展,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/ 本文通过分析 Java 动态代理的机制和特 ...

随机推荐

  1. Hibernate 报错:this project is not a myeclipse hibernate project . assuming hibernate 3 cap

    问题描述:  web 项目中 打开 hibernate.cfg.xml 文件时 提示:The project is not a myEclipse hibernate project. 并且:在 db ...

  2. css3设置box-pack和box-align让div里面的元素垂直居中

    只要设置元素的box-pack和box-align即可,这两个属性当前只有webkit和moz支持,要设置垂直居中的话只需要将这两个属性的值都设置为center即可,需要的朋友可以参考下   以前处理 ...

  3. CentOS添加中科大、163 yum源

    首先备份CentOS-Base.repo [root@richard yum.repos.d]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos ...

  4. Set无序怎么办?

    在JAVA中,提供多种不同的结构来组织对象,Set(集合)是其中的一种,本身是一个接口,其迭代时的顺序取决于其具体实现. 典型的实现包括: HashSet:哈希表是通过使用称为散列法的机制来存储信息的 ...

  5. new String[0]的作用

    返回包含此 collection 中所有元素的数组:返回数组的运行时类型与指定数组的运行时类型相同.如果指定的数组能容纳 该 collection,则返回包含此 collection 元素的数组.否则 ...

  6. 6.828 lab1 bootload

    MIT6.828 lab1地址:http://pdos.csail.mit.edu/6.828/2014/labs/lab1/ 第一个练习,主要是让我们熟悉汇编,嗯,没什么好说的. Part 1: P ...

  7. Win32应用程序的基本结构

    0 引言 Win32 API是用于创建 Windows 应用程序的应用程序编程接口.通常情况下,一个Win32应用包含一下几个部分: 1)    应用程序入口: 2)    注册窗口类: 3)    ...

  8. 手机触屏的js事件

    处理Touch事件能让你跟踪用户的每一根手指的位置.你可以绑定以下四种Touch事件:     1.touchstart:  // 手指放到屏幕上的时候触发      2.touchmove:  // ...

  9. Activity之间定时跳转

    起源:很多应用在打开时,首先会加载欢迎页面,经过几秒后再跳转到主页面. 下面,我通过两种不同的方式来实现页面的定时跳转. 第一种方式: 通过Timer类的schedule方法. 实现从MainActi ...

  10. 请求(Request)的参数(Parameter)里包含特殊字符(#等)的正确处理方式

    遇到一个问题 在一个地址链接(URL)里使用 url?param1=val1&param2=val2 的方式传递参数,结果在获取参数值时发现不是当初设定的值. 具体案例 以特殊字符井号(#)为 ...