详解java JDK 动态代理类分析(java.lang.reflect.Proxy)
详解javaJDK动态代理类分析(java.lang.reflect.Proxy)
/**
*JDK动态代理类分析(java.lang.reflect.Proxy使用)
*
*@author张明学
*
*/
publicclassProxyStudy{
@SuppressWarnings("unchecked")
publicstaticvoidmain(String[]args)throwsException{
//动态代理类:通用指定类加载器,和接口产生一类
//getProxyClass()返回代理类的java.lang.Class对象,并向其提供类加载器和接口数组。
ClassclazzProxy=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);
System.out.println("动态产生的类名为:"+clazzProxy.getName());
System.out.println("----------获取动态产生的类的构造方法---------");
Constructor[]constructors=clazzProxy.getConstructors();
inti=1;
for(Constructorconstructor:constructors){
System.out.println("第"+(i++)+"个构造方法名:"+constructor.getName());
Class[]parameterClazz=constructor.getParameterTypes();
System.out.println("第"+(i++)+"个构造方法参数:"+Arrays.asList(parameterClazz));
}
System.out.println("----------获取动态产生的类的普通方法---------");
Method[]methods=clazzProxy.getDeclaredMethods();
for(intj=0;j进入构造方法传进的handler的invoke方法————>invoke方法调用handler中的target对象
*的x方法(所以要求target必须要实现构造动态代理类时指定的接口)并返回它的返回值。(其实如果我们代理P类,那么target就可以选中P类,只是要求P必需实现一个接口)
*
*那么上述中x方法有哪些呢?除了从Object继承过来的方法中除toString,hashCode,equals外的方法不交给handler外,其它的方法全部交给handler处理
*如上面proxyBuildCollection.getClass().getName()就没有调用handler的getClass方法,而是调用自己的
*
*3,在handler的invoke方法中returnmethod.invoke(target,args)就是将方法交给target去完成。那么在这个方法执行之前,之后,异常时我们都可以做一些操作,
*并且可以在执行之前检查方法的参数args,执行之后检查方法的结果
*/
System.out.println("-------------------下面的写法更简便--------------------");
//proxyBuildColl是对ArrayList进行代理
CollectionproxyBuildCollection2=(Collection)Proxy.newProxyInstance(
Collection.class.getClassLoader(),//指定类加载器
newClass[]{Collection.class},//指定目标对象实现的接口
//指定handler
newInvocationHandler(){
ArrayListtarget=newArrayList();
publicObjectinvoke(Objectproxy,Methodmethod,
Object[]args)throwsThrowable{
System.out.println(method.getName()+"执行之前...");
if(null!=args){
System.out.println("方法的参数:"+Arrays.asList(args));
}else{
System.out.println("方法的参数:"+null);
}
Objectresult=method.invoke(target,args);
System.out.println(method.getName()+"执行之后...");
returnresult;
}
});
proxyBuildCollection2.add("abc");
proxyBuildCollection2.size();
proxyBuildCollection2.clear();
proxyBuildCollection2.getClass().getName();
System.out.println("-------------------对JDK动态代理的重构--------------------");
SetproxySet=(Set)buildProxy(newHashSet(),newMyAdvice());
proxySet.add("abc");
proxySet.size();
}
/**
*构造一个目标对象的代理对象
*
*@paramtarget
*目标对象(需要实现某个接口)
*@return
*/
publicstaticObjectbuildProxy(finalObjecttarget,finalAdviceInteradvice){
ObjectproxyObject=Proxy.newProxyInstance(
target.getClass().getClassLoader(),//指定类加载器
target.getClass().getInterfaces(),//指定目标对象实现的接口
//handler
newInvocationHandler(){
publicObjectinvoke(Objectproxy,Methodmethod,
Object[]args)throwsThrowable{
advice.beforeMethod(target,method,args);
Objectresult=method.invoke(target,args);
advice.afterMethod(target,method,args);
returnresult;
}
});
returnproxyObject;
}
}
/**
*代理中执行目标方法之前之后的操作的一个实例
*
*@author张明学
*
*/
publicclassMyAdviceimplementsAdviceInter{
publicvoidafterMethod(Objecttarget,Methodmethod,Object[]args){
System.out.println("目标对象为:"+target.getClass().getName());
System.out.println(method.getName()+"执行完毕!");
}
publicvoidbeforeMethod(Objecttarget,Methodmethod,Object[]args){
System.out.println(method.getName()+"开始执行");
if(null!=args){
System.out.println("参数为:"+Arrays.asList(args));
}else{
System.out.println("参数为:"+null);
}
}
}
/**
*代理中执行目标方法之前之后的操作
*
*@author张明学
*
*/
publicinterfaceAdviceInter{
/**
*目标方法执行之前
*
*/
publicvoidbeforeMethod(Objecttarget,Methodmethod,Object[]args);
/**
*目标方法执行之后
*
*@paramtarget
*目标对象
*@parammethod
*方法
*@paramargs
*参数
*/
publicvoidafterMethod(Objecttarget,Methodmethod,Object[]args);
}