java动态代理-JDK

本文介绍了Java中JDK动态代理的实现过程,包括定义接口、实现接口、创建InvocationHandler以及调用过程。动态代理主要用于控制对目标对象的访问,通过代理类执行预处理、过滤和转发操作。涉及关键类有Proxy、InvocationHandler和ClassLoader,其中Proxy提供动态生成代理对象的能力,InvocationHandler负责处理方法调用。

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

        动态代理是设计模式中的一种。其目的是通过为其他对象提供一个代理,达到控制对某个对象的访问。代理类为委托类做消息预处理、过滤、转发,以及做一些后续处理。

        实现JDK(接口型)动态代理(必须实现接口才能代理):

                1.定义一个接口   
          public interface Dog
                 {
                    public void run(String dogType, float speed);
                    public void eat(String dogType, String food);
                }
                2.实现接口 
public class DogImpl  implements Dog
{

	@Override
	public void run(String dogType, float speed) {
		
		System.out.println(dogType + " can run very fast! Can reach " + speed + " m/s");
		
	}

	@Override
	public void eat(String dogType, String food) {
		
		System.out.println(dogType + " likes to eat  " + food);
		
	}
	
}
                3.定义一个invocationHandler类,实现InvocationHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DogInvokationHandler implements InvocationHandler
{

	private Object object;
	
	public Object newProxy(Object object, Class[] interfaces)
	{
		this.object = object;
		
		return Proxy.newProxyInstance(object.getClass().getClassLoader(), object
                .getClass().getInterfaces(), this);

	}
	

	 /** 
     * @param proxy --代理对象 
     * @param method -- 方法,被调用方法. 
     * @param args -- 方法的参数 
     */  
	@Override
	public Object invoke(Object obj, Method method, Object[] var3) throws Throwable {
		// before
		System.out.println("在调用Dog接口的方法前,先做点儿别的。");
		// 调用被代理类方法
		method.invoke(object, var3);
		// after
		System.out.println("在调用Dog接口的方法后,处理下后续。");
		return null;
	}
	
}          

         

                 4.调用   
public class ProxyTest {
	
	public static void main(String[] args) {
		
		Dog dog = new DogImpl();
		DogInvokationHandler dogInvokationHandler = new DogInvokationHandler();
		dog = (Dog) dogInvokationHandler.newProxy(dog,new Class[] {Dog.class});
		dog.run("Gree dog", 70);
	}
}

         运行输出结果:          

                                    

        代理涉及的类:    

                1.java.lang.reflect.Proxy,java动态代理机制类:提供一组静态方法为一组接口动态地生成代理类及其对象。

                2.java.lang.reflect.InvocationHandler,调用处理器接口:定义了一个invoke方法,用于集中处理动态代理类对象上的方法调用。通常在该方法中实现对委托类的代理访问。

                3.java.lang.ClassLoader,类加载器:负责将类的字节码装载到JVM中,并未其定义类对象。该类才能被使用

            实际上动态代理的基本角色有三种:

                        1.Subject——负责定义RealSubject和Proxy角色应该实现的接口

                        2.RealSubject——真正完成业务服务功能

                        3.Proxy——将请求调用RealSubject对应的request功能来实现业务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值