继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

JAVA实现动态代理

刘信坚
关注TA
已关注
手记 52
粉丝 7795
获赞 665

一 动态代理

动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象,下面直接看代码:


二 测试

Animal.java

package com.lxj.dynamic.proxy;


public interface Animal {
	
	public void action();
	public void breath();
	
}

Cat.java

package com.lxj.dynamic.proxy;

//被代理类Cat
public class Cat implements Animal {

	@Override
	public void action() {
		System.out.println("喵喵喵~~~~");
	}

	@Override
	public void breath() {
		System.out.println("猫式呼吸法~~~~");
	}

}

Dog.java

package com.lxj.dynamic.proxy;

//被代理类 Dog
public class Dog implements Animal {

	@Override
	public void action() {
        System.out.println("汪汪汪~~~~~");
	}

	@Override
	public void breath() {
        System.out.println("狗式呼吸法~~~~");
	}

}

MyProxy.java

package com.lxj.dynamic.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;


//代理类MyProxy,动态代理需要实现InvocationHandler接口
public class MyProxy implements InvocationHandler{
	
	Object obj;
	
	public MyProxy() {}
	
	public void setObj(Object obj) {
		this.obj = obj;
	}
	
	//代理类调用方法时,都会调用invoke方法
	//method:代理对象执行的方法
	//args:参数
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("==============代理类开始执行!!!!=============");
		//returnVal是方法的返回值
		Object returnVal = method.invoke(obj, args);
		System.out.println("==============代理类执行结束!!!!=============");
		return returnVal;
	}
	
}

ProxyUtil.java

package com.lxj.dynamic.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class ProxyUtil {
	 
	 public static Object getProxyInstance(Object obj) {
		   MyProxy proxy = new MyProxy();
		   proxy.setObj(obj);
		   /*
		    *  obj.getClass().getClassLoader():被代理对象的类加载器
		    *  obj.getClass().getInterfaces() :被代理对象的接口
		    *  实质上是通过反射将被代理类的加载器和接口与代理对象关联起来
		    *  obj :是被代理的对象
		    *  proxy:实现InvocationHandler的接口
		    */
		   return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), proxy);
	 }
	
}

TestDynamicProxy.java

package com.lxj.dynamic.proxy;


public class TestDynamicProxy {
    public static void main(String[] args) {
    	Cat cat = new Cat();
    	Object proxyInstance = ProxyUtil.getProxyInstance(cat);
        Animal animal = (Animal) proxyInstance;
        animal.action();
        animal.breath();
        
        
        Dog dog = new Dog();
        proxyInstance = ProxyUtil.getProxyInstance(dog);
        animal = (Animal) proxyInstance;
        animal.action();
        animal.breath();
	}
}

 

三 运行结果

        动态代理的代理对象是在运行时动态创建目标类的代理对象,而静态代理是需要为每个目标类创建代理对象,动态代理只需要一个方法就可以,相比静态代理代码冗余量减少了。

https://img2.mukewang.com/5b5b4d2b0001f8ef11230838.jpg















打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP