• 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();
    
    
    	}
    
    }
  • 相关阅读:
    【C++】不同含义new和delete
    苹果Lion 操作系统还没到成熟时 不及格的程序员
    视图旋转方式 不及格的程序员
    来电归属地 黑名单‘s 不及格的程序员
    dispatch_async 线程分发注意事项. 不及格的程序员
    IEEE printf specification 不及格的程序员
    What is the new iPad retina display? 不及格的程序员
    图形设备接口的起源 不及格的程序员
    windows xp 遭遇administrator账号劫持 不及格的程序员
    What does "not supported" mean? 不及格的程序员
  • 原文地址:https://www.cnblogs.com/wangerxiansheng/p/3836396.html
Copyright © 2020-2023  润新知