代理二:深入研究InvocationHandler、动态代理类工作原理、实现AOP框架

本文深入探讨了Java动态代理机制,通过实例分析了InvocationHandler的工作原理,解释了为何在某些情况下会出现NullPointerException。此外,文章还总结了动态代理类的设计原理与结构,并展示了如何实现一个类似Spring的可配置AOP框架,包括BeanFactory和ProxyFactoryBean的角色及其配置方式。
摘要由CSDN通过智能技术生成

9  通过实例深入研究InvocationHandler

先看如下代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Collection;

public class ProxyDemo4 {
	public static void main(String[] args) throws Exception {
		//动态生成代理类的Class实例,此代理类实现Collection接口并调用目标类的方法
		Class clazzProxy = 
			Proxy.getProxyClass(Collection. class.getClassLoader(), Collection.class );
		
		System.out.println("--------begin create instance object-------");
		
		//获得此代理类的构造方法
		Constructor constructor = clazzProxy.getConstructor(InvocationHandler. class) ;
		
		//生成一个代理类对象,InvocationHandler用匿名内部类。invoke方法封装了要执行的目标代码
		Collection proxy = ( Collection)constructor.newInstance( new InvocationHandler(){
			public Object invoke(Object proxy, Method method, Object[] args)
				throws Throwable {
				return null ;
			}
		});
		
		System.out.println(proxy); //结果:null
		proxy.clear();  //执行没有返回值的方法,不会报告异常
		proxy.size();  //执行有返回值的方法,会报告空指针异常
        System.out.println(proxy.getClass()); //class $Proxy0
	}
}


1分析上面打印动态类的实例对象时,结果为什么会是null呢?

         答:打印动态类的示例对象实际上就是打印proxytoString方法,也就是执行代理对象中的如下代码:

         String toString(){
              return handler.invoke(this, this.getClass().getMethod("toString"), null);
         }

         由于invoke方法返回的是null,打印出来的结果肯定是null

 

2调用有基本类型返回值的方法时为什么会出现NullPointerException异常?

         答:执行proxy.size()方法,就是执行下面的代码:

         int size(){
              return handler.invoke(this, this.getClass().getMethod("size"), null);
         }

         由于invoke

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值