博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过反射创建动态代理对象(一)
阅读量:6684 次
发布时间:2019-06-25

本文共 2294 字,大约阅读时间需要 7 分钟。

hot3.png

一、概述

    1、先通过反射创建一个代理类功能的Class对象

    2、创建代理类的实例,并通过调用代理类的方法来调用目标对象

二、代码说明

package staticimport.proxy;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Collection;import java.util.Objects;/*** *  * 1、先通过反射创建一个代理类功能的Class对象 * 2、创建代理类的实例,并通过调用代理类的方法来调用目标对象 *  * @author Liu * */public class ProxyTest {	//通过反射或者一个代理对象的Class	public static void main(String[] args) throws Exception {		Class clazz = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);		Constructor[] constructors = clazz.getConstructors();				System.out.println("----------------Constructors list-----------------");		for(Constructor constructor : constructors){			StringBuilder sb = new StringBuilder(constructor.getName());			sb.append('(');						Class[] classes = constructor.getParameterTypes();						for(Class clzz : classes){				sb.append(clzz.getName()).append(',');			}						if(Objects.nonNull(classes) && classes.length != 0){				sb.deleteCharAt(sb.length() - 1);			}						sb.append(')');						System.out.println(sb);		}				System.out.println("----------------Methods list-----------------");				Method[] methods = clazz.getMethods();				for(Method method : methods){			StringBuilder sb = new StringBuilder(method.getName());			sb.append('(');						Class[] classes = method.getParameterTypes();						for(Class clzz : classes){				sb.append(clzz.getName()).append(',');			}			if(Objects.nonNull(classes) && classes.length != 0){				sb.deleteCharAt(sb.length() - 1);			}						sb.append(')');						System.out.println(sb);		}				/*********************利用反射创建实例**********************/		Constructor constructor = clazz.getConstructor(InvocationHandler.class);		Collection collection = (Collection) constructor.newInstance(new InvocationHandler(){			@Override			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {				//死循环//				return method.invoke(proxy, args);								return null;			}});				System.out.println(collection);		System.out.println(collection.toString());		//而这里为什么不报错?因为clear()方法返回值为void		collection.clear();		//这里为什么报空指针异常?因为传递给构造器的InvocationHandler中的invoke返回值是null		System.out.println(collection.size());		}}

 

转载于:https://my.oschina.net/Howard2016/blog/1617988

你可能感兴趣的文章
Qt字符串与整形转换
查看>>
A Course on Borel Sets Exercise 1.3.6 ii
查看>>
数据结构-栈
查看>>
信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮
查看>>
病毒分析基础(一)
查看>>
【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍...
查看>>
django基础知识~RBAC实验部分代码记录
查看>>
Kruskal && Prim模板
查看>>
php自己总结的一些经典的实例
查看>>
Todolist总结
查看>>
c++二叉树
查看>>
socket编程 (PHP实现)
查看>>
SBM is Not Sale And Run Company
查看>>
echarts - 使用echarts过程中遇到的问题(pending...)
查看>>
131125 - 关于对“一次元”、“二次元”、“三次元”的兴趣变化的奇思妙想
查看>>
不要伤害指针(3)--指针和结构类型的关系
查看>>
better-scroll 上拉加载,下拉刷新(解决移动端长页面卡顿)
查看>>
分布式缓存
查看>>
java多线程
查看>>
【洛谷3377】 左偏树(可并堆)
查看>>