• 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();
    
    
    	}
    
    }
  • 相关阅读:
    CODEVS4650 破损的键盘
    洛谷P1656 炸铁路
    洛谷 P3225 [HNOI2012]矿场搭建
    1265 四点共面
    1406: [AHOI2007]密码箱
    1193: [HNOI2006]马步距离
    1800: [Ahoi2009]fly 飞行棋
    1923: [Sdoi2010]外星千足虫
    I
    2017CCPC秦皇岛G ZOJ 3987Numbers(大数+贪心)
  • 原文地址:https://www.cnblogs.com/wangerxiansheng/p/3836396.html
Copyright © 2020-2023  润新知