反射调用方法,如果方法抛出异常,会被包装成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. 常用的本地存储-----cookie篇

    1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要最新数据也可以减少向服务器 ...

  2. Java学习之:Spring的扩展配置

    1.在配置文件applicationContext.xml中,引入相关的配置文件方式: 2.使用Jndi数据源的方式改造配置文件applicationContext.xml: 3.注释配置文件appl ...

  3. Mac pro操作快捷键

    1. 在Finder顶部显示文件/文件夹全路径 终端里输入:defaults write com.apple.finder _FXShowPosixPathInTitle -bool TRUE;kil ...

  4. [Doxygen].Docygen使用

    转自:https://www.cnblogs.com/chenyang920/p/5732643.html Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,可以从一套归档源文 ...

  5. zabbix--自定义监控项vsftpd

    Zabbix 自定义监控项之监控 vsftpd zabbix 提供了很多监控选择,功能丰富,我们还可以根据自定义来监控想要监控一些日常的服务等. 说明: 此处我们通过监控 ftp (自定义命令),实现 ...

  6. 纯数据结构Java实现(9/11)(AVL)

    欢迎访问我的自建博客: CH-YK Blog.

  7. 用于Python扩展包的非官方Windows二进制文件

    https://www.lfd.uci.edu/~gohlke/pythonlibs/ Index by date: peewee aiohttp indexed_gzip pygit2 pymatg ...

  8. discuz x3.3排行首页图片显示更多的图片

    找到\source\include\misc\misc_ranklist_index.php文件,修改41行 $ranklist = getranklist_pictures_index(9); 为 ...

  9. Nuxt.js 提供了两种发布部署应用的方式:服务端渲染应用部署 和 静态应用部署

    官方网址:https://zh.nuxtjs.org/guide/commands/#%E5%8F%91%E5%B8%83%E9%83%A8%E7%BD%B2

  10. 【Android Studio】 资源下载

    Gradle各版本集合 http://services.gradle.org/distributions/ Android Studio各版本集合 http://www.android-studio. ...