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

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

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值