java动态代理

本文介绍了Java动态代理的使用,通过代码示例展示了如何动态增强方法,指出其在解决装饰者模式冗余代码问题上的优势。

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

动态代理


废话不多数,直接上干货

  1. 这是接口的代码
public interface Car {
	public void start();
	public void run();
	public void stop();
	
	public String test(int a,int b);
}
  1. 这是实现类的代码
public final class GoogleCar implements Car {

	@Override
	public void start() {
		System.out.println("start...");
	}

	@Override
	public void run() {
		System.out.println("run...");
	}

	@Override
	public void stop() {
		System.out.println("stop...");
	}

	@Override
	public String test(int a, int b) {
		return a+"==="+b;
	}
}
  1. 这是动态代理的代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class Test {

	public static void main(String[] args) {
		// 参数一:当前类的加载器
		// 参数二:代理的类的接口的方法总数
		// 参数三:解决方案
		// 返回值:代理的类的接口类实现类的的实例
		Car car = (Car)Proxy.newProxyInstance(Test.class.getClassLoader(), GoogleCar.class.getInterfaces(), new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//				System.out.println(proxy.getClass().getName()); //不知道有什么用
//				System.out.println(method.getName());	//获取当前方法
//				System.out.println(Arrays.deepToString(args)); //方法的参数
				Object obj = null;
				obj = method.invoke(new GoogleCar(), args);//执行该方法 并接受返回值 如果有的话
				return obj; //返回值 如果有的话
			}
		});
		
		car.start();
		car.run();
		car.stop();
		String s = car.test(10, 30);
		System.out.println(s);
	}
}
  1. 动态增强某个方法
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test2 {
	public static void main(String[] args) {
		
		Car c =(Car)Proxy.newProxyInstance(Test2.class.getClassLoader(), GoogleCar.class.getInterfaces(), new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				Object obj = null;
				if(method.getName().equalsIgnoreCase("test")) {//找到需要增强的方法
					System.out.println("参数1--->"+args[0]);
					System.out.println("参数2--->"+args[1]);
					
					obj = method.invoke(new GoogleCar(), args);
				}else {
					obj = method.invoke(new GoogleCar(), args);
				}
				
				return obj;
			}
		});
		
		c.start();
		c.run();
		c.stop();
		String s = c.test(10, 20);
		System.out.println(s);
	}
}

总结

使用动态代理可以很好解决装饰者模式下的冗余代码的弊端
需要增强那个方法只要指定那个方法,不需要重写其他不需要改变的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值