反射调用异常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和代理类抛出异常的更多相关文章
- C#反射调用 异常信息:Ambiguous match found.
异常信息(异常类型:System.Reflection.AmbiguousMatchException)异常提示:Ambiguous match found.异常信息:Ambiguous match ...
- 在C++中反射调用.NET(一)
为什么要在C++中调用.NET 一般情况下,我们常常会在.NET程序中调用C/C++的程序,使用P/Invoke方式进行调用,在编写代码代码的时候,首先要导入DLL文件,然后在根据C/C++的头文件编 ...
- Web Serveice服务代理类生成及编译
本文链接地址:http://www.cnblogs.com/dengxinglin/p/3334158.html 一.生成代理类 对于web service服务和wcf的webservice服务,我们 ...
- Java通过代理类实现数据库DAO操作
下面的所有代码示例都取自李兴华的<Java Web开发实战经典>的随书源码,因为觉得设计得很好,所以将代码摘录下来作成笔记. 首先,我们在一个java文件中定义要存储的结构类型: impo ...
- 在C++中反射调用.NET(三)
在.NET与C++之间传输集合数据 上一篇<在C++中反射调用.NET(二)>中,我们尝试了反射调用一个返回DTO对象的.NET方法,今天来看看如何在.NET与C++之间传输集合数据. 使 ...
- ssh+c3p0调用存储过程、组拼STRUCT时仅使用一个connection的方法 c3p0代理类转原始类(connection)
正常情况,我们会调用存储过程用hibernate提供的连接池代理连接类来调用存储过程,而用新建连接给存储过程组拼STRUCT. 但是这样感觉可以再一步的优化:调用存储过程与构建STRUCT用hiber ...
- java动态载入指定的类或者jar包反射调用其方法
序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下 ...
- VS2010 F5调试时出现:“ 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常”解决
VS2010 F5调试时出现 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常 两个解决方法:1) 打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上.2) 打开项目属性,选择调试选 ...
- 动态调用WebService的代理类
using System; using System.Collections; using System.ComponentModel; using System.Data; using System ...
随机推荐
- springboot脚手架liugh-parent源码研究参考
1. liugh-parent源码研究参考 1.1. 前言 这也是个开源的springboot脚手架项目,这里研究记录一些该框架写的比较好的代码段和功能 脚手架地址 1.2. 功能 1.2.1. 当前 ...
- 【总结】web工作代码分类整理(持续更新)
文件.blob 文件下载失败,将Blob对象转换为Json,处理异常错误? 使用FileReader,核心代码: var reader = new FileReader() reader.onload ...
- Java 数组(二)基本操作
一.数组的基本操作 1.数组遍历[重点] 数组遍历:就是将数组中的每个元素分别获取出来,就是遍历.遍历也是数组操作中的基石. 方式一:使用索引下标方式 int[] array = { 15, 25, ...
- QCache 缓存(类似于map的模板类,逻辑意义上的缓存Cache,方便管理,默认类似于LRU的淘汰算法)
最近在学习缓存方面的知识,了解了缓存(Cache)的基本概念,为什么要使用缓存,以及一些缓存算法(缓存替换),如LRU.LFU.ARC等等. 这些缓存算法的实现过程会使用一些基本的数据结构,如list ...
- 【robotframework】pycharm+robotframe(转)
[robotframework]pycharm+robotframe 一.环境搭建 二.框架介绍 1.settings 是这个测试套件的全局配置表 说明这个测试套件要使用的测试库.资源文件 测试套 ...
- Odoo权限控制详解
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826105.html 一:Odoo中的权限设置主要有以下5种 1)菜单.报表的访问权限 Odoo可以设置菜 ...
- linux 命令输出保存为文件的三种方式
一.ls >2.txt 将ls命令直接保存到home文件夹下的2.txt,命令窗口无显示 二.ls | tee 2.txt 也是直接保存在了home文件夹下的2.txt,命令 ...
- Spring Boot 之:Spring Boot Admin
client 连接都 admin 时报错: 2019-08-22 11:58:37.695 ERROR 55095 --- [nio-8000-exec-1] o.a.catalina.connect ...
- PL/SQL Developer 快捷键
前面我有分享了一个PLSQL美化规则,其实通过统一的美化SQL,把这里SQL写在Java代码里可以比较容易阅读代码,且保持良好得编码风格. 在工作中我们也经常使用PLSQL来写一SQL,有些常用的SQ ...
- 异常sql处理
下面是在awr报告里面看到的有问题的sql,是9个变量的,在应用前台属于关联查询,在sqlplus里面手工执行检查实际执行情况如下: SELECT /*+ GATHER_PLAN_STATISTICS ...