JAVA实现动态代理

本文介绍了JAVA动态代理的概念,动态代理允许在程序运行时根据需要动态创建目标类的代理对象,以减少代码冗余。文章通过代码示例展示了如何创建和测试动态代理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 动态代理

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

 

二 测试

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();
	}
}

三 运行结果

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

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值