• 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();
    
    
    	}
    
    }
  • 相关阅读:
    pandas高效实现条件逻辑
    Python教程:文件、异常处理和其他
    最终初学者指南,以数据科学用例赢得分类黑客马拉松
    用Nvidia Jetson Nano 2GB和Python构建一个价值60美元的人脸识别系统
    一幅图像能顶16x16字!——用于大规模图像缩放识别的变压器(对ICLR 2021年论文的简要回顾)
    接缝雕刻算法:一种看似不可能的图像大小调整方法
    apache与nginx的优缺点的比较
    php5与php7的区别
    git基本的命令大全
    redis和membercache的区别
  • 原文地址:https://www.cnblogs.com/wangerxiansheng/p/3836396.html
Copyright © 2020-2023  润新知