zoukankan      html  css  js  c++  java
  • Java动态代理机制——JDK

    动态代理机制是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();
    
    
    	}
    
    }
  • 相关阅读:
    python-用闭包(装饰器)实现计算器的功能
    python 斐波那契数列
    python 递归方法
    python冒泡排序
    一步步学习ASP.NET MVC3 (6)——@helper,@functions
    一步步学习ASP.NET MVC3 (5)——View从Action中获得数据
    一步步学习ASP.NET MVC3 (4)——Razor(2)
    一步步学习ASP.NET MVC3 (3)——Razor(1)
    ASP.NET MVC Spring.NET NHibernate 整合
    ASP.NET MVC NHibernate 整合
  • 原文地址:https://www.cnblogs.com/wangerxiansheng/p/3836396.html
Copyright © 2011-2022 走看看