为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA实现动态代理

标签:
Java 面试 架构

一 动态代理

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


二 测试

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://img1.sycdn.imooc.com//5b5b4d2b0001f8ef11230838.jpg















点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
7795
获赞与收藏
665

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消