反射调用方法,如果方法抛出异常,会被包装成InvocationTargetException。
如果反射对象被代理了,在代理类中抛出异常,不会被包装成InvocationTargetException。
 
package com.loull.test.aop;

public interface Person {
void sayHello();
}
package com.loull.test.aop;

public class PersonImpl implements Person {

    @Override
public void sayHello() {
throw new RuntimeException("sayHello Exp");
} }
package com.loull.test.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; public class ProxyExpTest { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,
SecurityException, InstantiationException,
IllegalAccessException {
Class<?> personImplClz = Class.forName("com.loull.test.aop.PersonImpl");
Method method = personImplClz.getMethod("sayHello"); try {
method.invoke(personImplClz.newInstance());
} catch (Exception e) {
e.printStackTrace();
} Object person = personImplClz.newInstance();
Person proxyPersion = (Person) Proxy.newProxyInstance(personImplClz.getClassLoader(),
person.getClass().getInterfaces(), new MyInvocationHandler(person, true));
try {
proxyPersion.sayHello();
} catch (Throwable e) {
e.printStackTrace();
} System.out.println("cglib");
MyCglibProxy cglibProxy = new MyCglibProxy();
Person cglibPerson = (Person) cglibProxy.getInstance(personImplClz.newInstance(), true);
try {
cglibPerson.sayHello();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("cglib end");
} static class MyCglibProxy implements MethodInterceptor { private Object target; private boolean exp; public Object getInstance(Object target, boolean exp) {
this.target = target;
this.exp = exp; Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
//
enhancer.setCallback(this);
//
return enhancer.create();
} @Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("cglib_before invoke");
if (exp) {
throw new OutOfMemoryError("proxy exp cglib");
}
Object result = proxy.invokeSuper(obj, args);
System.out.println("cglib_after invoke");
return result;
} } static class MyInvocationHandler implements InvocationHandler { private Object target; private boolean exp; public MyInvocationHandler(Object target, boolean exp) {
this.target = target;
this.exp = exp;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before invoke");
if (exp) {
throw new OutOfMemoryError("proxy exp");
}
Object result = method.invoke(target, args);
System.out.println("after invoke");
return result;
} } }

输出:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.alipay.test.aop.ProxyExpTest.main(ProxyExpTest.java:20)
Caused by: java.lang.RuntimeException: sayHello Exp
at com.alipay.test.aop.PersonImpl.sayHello(PersonImpl.java:7)
... 5 more
java.lang.OutOfMemoryError: proxy exp
at com.alipay.test.aop.ProxyExpTest$MyInvocationHandler.invoke(ProxyExpTest.java:92)
at com.sun.proxy.$Proxy0.sayHello(Unknown Source)
at com.alipay.test.aop.ProxyExpTest.main(ProxyExpTest.java:29)
before invoke
cglib
cglib_before invoke
java.lang.OutOfMemoryError: proxy exp cglib
at com.alipay.test.aop.ProxyExpTest$MyCglibProxy.intercept(ProxyExpTest.java:68)
at com.alipay.test.aop.PersonImpl$$EnhancerByCGLIB$$9174c686.sayHello(<generated>)
at com.alipay.test.aop.ProxyExpTest.main(ProxyExpTest.java:38)
cglib end

反射调用异常InvocationTargetException和代理类抛出异常的更多相关文章

  1. C#反射调用 异常信息:Ambiguous match found.

    异常信息(异常类型:System.Reflection.AmbiguousMatchException)异常提示:Ambiguous match found.异常信息:Ambiguous match ...

  2. 在C++中反射调用.NET(一)

    为什么要在C++中调用.NET 一般情况下,我们常常会在.NET程序中调用C/C++的程序,使用P/Invoke方式进行调用,在编写代码代码的时候,首先要导入DLL文件,然后在根据C/C++的头文件编 ...

  3. Web Serveice服务代理类生成及编译

    本文链接地址:http://www.cnblogs.com/dengxinglin/p/3334158.html 一.生成代理类 对于web service服务和wcf的webservice服务,我们 ...

  4. Java通过代理类实现数据库DAO操作

    下面的所有代码示例都取自李兴华的<Java Web开发实战经典>的随书源码,因为觉得设计得很好,所以将代码摘录下来作成笔记. 首先,我们在一个java文件中定义要存储的结构类型: impo ...

  5. 在C++中反射调用.NET(三)

    在.NET与C++之间传输集合数据 上一篇<在C++中反射调用.NET(二)>中,我们尝试了反射调用一个返回DTO对象的.NET方法,今天来看看如何在.NET与C++之间传输集合数据. 使 ...

  6. ssh+c3p0调用存储过程、组拼STRUCT时仅使用一个connection的方法 c3p0代理类转原始类(connection)

    正常情况,我们会调用存储过程用hibernate提供的连接池代理连接类来调用存储过程,而用新建连接给存储过程组拼STRUCT. 但是这样感觉可以再一步的优化:调用存储过程与构建STRUCT用hiber ...

  7. java动态载入指定的类或者jar包反射调用其方法

    序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下 ...

  8. VS2010 F5调试时出现:“ 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常”解决

    VS2010 F5调试时出现 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常 两个解决方法:1) 打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上.2) 打开项目属性,选择调试选 ...

  9. 动态调用WebService的代理类

    using System; using System.Collections; using System.ComponentModel; using System.Data; using System ...

随机推荐

  1. vue 封装公用函数

    Vue 函数封装 格式化浏览器时间 /** * 格式化时间 * @param params * @param blo 默认为true * @returns {string} * @constructo ...

  2. jQuery的内部运行机制和原理

    jQuery的优点: jQuery是一个非常优秀的JavaScript库,与Prototype,YUI,Mootools等众多的Js类库相比,它剑走偏锋,从Web开发实用的角度出发,抛除了其它Lib中 ...

  3. mybatis 批量添加数据的两种实现方式

    做开发的这几年期间经常遇到类似处理这种形式数据的问题,也遇到很多刚刚入行的新同学,发现他们做处理这块,经验不够,今天特地整理了一下,大家都会遇到的几种情况,代码也都粘贴出来了,拿去不谢,有时间大家还是 ...

  4. elasticsearch Terms Query 实现类似于sql in查询

    本文demo基于elasticsearch 5.1.1,  项目中使用的还是较早的版本 例如 import com.alibaba.fastjson.JSON; import org.elastics ...

  5. 分析一个UBOOT的方法

    1. 编译完成后可以看到在主目录下生成了uboot.bin文件,为了方便分析,使用如下命令将其反汇编:arm-linux-objdump -D -m arm u-boot > u-boot.as ...

  6. IDEA 创建类是自动添加注释和创建方法时快速添加注释

    1.创建类是自动添加注释 /*** @Author: chiyl* @DateTime: ${DATE} ${TIME}* @Description: TODO*/2. 创建方法时快速添加注释2.1 ...

  7. .DS_Store文件是什么?Mac系统如何彻底清除该文件?

    用过Mac OS系统的都会注意到一个名为.DS_Store的隐藏文件,尤其是zip格式的压缩包解压的出来,会出现在各种文件夹内,非常烦人! 特别是把文件分享给使用windows的朋友的时候,这些文件会 ...

  8. Python 函数返回值类型

    [ i for i in dir(set) if not i.startswith('_') ]   

  9. react native iOS真机调试-联网问题与js严格模式

    rn:strict mode does not allow function declarations in a lexically nested statement https://blog.csd ...

  10. Python 弹出框代码

      from ctypes import * user32 = windll.LoadLibrary('user32.dll')#调用dll文件 #a是得到弹出框的选择按钮的值 user32.Mess ...