【Java进阶-Java动态代理与AOP】03 创建动态类的实例对象及调用其方法
2017-08-14 22:18
716 查看
【Java进阶-Java动态代理与AOP】03 创建动态类的实例对象及调用其方法
创建动态类的实例对象
由上一篇文章中分析,动态代理类只有一个构造方法com.sun.proxy.$Proxy4(java.lang.reflect.InvocationHandler)
因此,我们需要了解InvocationHandler这个接口,其中只有一个invoke方法,签名如下:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
proxy 表示代理对象
method 表示动态类传递过来的方法
args 表示动态类传递过来的参数
更多详细的内容留在以后的文章中说明。
下面,我们创建动态类的实例,代码如下:
/** * 通过代理创建对象 * @param clazzProxy1 * @return */ private static Collection newInstanceByProxy(Class clazzProxy1) throws Exception { Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class); Collection coll = (Collection)constructor.newInstance(new InvocationHandler(){ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return null; } }); return coll; }
调用动态类实例的方法
调用动态类实例的方法以及分析过程如下:/** * 创建代理类的实例 * 代理类的实例方法调用的限制 */ @Test public void newInstanceByProxyTest() throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class); Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class); Collection coll = (Collection)constructor.newInstance(new InvocationHandler(){ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return null; } }); System.out.println(coll); // null,但并非是空指针,而是返回值是 null 字符串 System.out.println(coll.toString()); //int size = coll.size(); //调用有返回值的方法会出现异常,因为返回值是 invoke的返回结果 null,null无法转换为int或其他类型, //但是可以转换为 void 类型,即无返回值 coll.clear(); }
InvocationHandler中的invoke方法的返回值,就是动态类的方法的返回值。
如果InvocationHandler中的invoke的返回值类型不能强转为动态类中方法的返回值的类型,将会抛出异常。
参考:
Java多线程与并发库高级应用教程
相关文章推荐
- 【Java进阶-Java动态代理与AOP】02 创建动态类及查看其方法列表信息
- Java代理学习-创建动态类的实例对象及调用其方法
- 黑马程序员--09.动态与代理AOP--03【InvocationHandler接口】【通过反射创建动态代理类对象】
- java动态代理对象实例的创建
- 【Java进阶-Java动态代理与AOP】04 实现InvocationHandler的invoke方法
- java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类
- 51_52创建动态类的实例对象及调用其方法
- 【Java进阶-Java动态代理与AOP】05 分析InvocationHandler对象的运行原理
- 11.2 创建动态代理实例即调用其方法
- 笔记2-----创建一个java实例对象的方法
- JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组
- Java动态调用类方法实例
- Java动态调用对象的方法
- 黑马程序员--Java基础加强--07.【反射创建对象 操作字段 调用方法的异同】【个人总结】
- java使用动态代理来实现AOP(日志记录)的实例代码
- 利用反射来动态创建实例和调用方法
- Java创建对象实例的三种方法
- [c#美味] 使用反射动态创建实例并调用方法
- 利用反射来动态创建实例和调用方法(上)
- java笔记 对象的创建和对象调用方法的详细过程