----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------
Proxy类:动态代理
Proxy类:提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
Proxy.getProxyClass(loader(), Interface.class);
生成一个动态代理Class对象。这个代理类实现了指定的接口(第二个参数),并被指定了一个类加载器(第一参数)。这个动态代理类拥有所实现的接口所有方法和Object类的成员方法,和一个带有一个参数的构造方法$Proxy0(java.lang.reflect.InvocationHandler),InvocationHandler是一个接口。
InvocationHandler类
InvocationHandler类中的invoke方法是关键,代理类对象每执行一次方法,就会来相应的InvocationHandler类中执行一次invoke方法,在此InvocationHandler类中的目标对象上操作任意的操作,然后返回一个Object对象给代理对象。
InvocationHandler类中public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{}proxy:接收相应的代理代理。
method:接收代理执行的方法对象。如果执行的是Object方法,那么只能是hashCode(),equals(),toString()。其余 的Object方法都不从这个InvocationHandler中过,而是直接代理自己执行。
args:接收代理执行方法的参数。
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
Proxy类:动态代理
Proxy类:提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
Proxy.getProxyClass(loader(), Interface.class);
生成一个动态代理Class对象。这个代理类实现了指定的接口(第二个参数),并被指定了一个类加载器(第一参数)。这个动态代理类拥有所实现的接口所有方法和Object类的成员方法,和一个带有一个参数的构造方法$Proxy0(java.lang.reflect.InvocationHandler),InvocationHandler是一个接口。
如果想要得到一个动态代理对象,可以通过以下步奏:通过getProxyClass来得到动态代理类Class对象,然后用这个对象的getConstructor方法得到构造方法Class对象,最后用构造方法对象的newInstance方法创建一个对象,注意参数是实现InvocationHandler的类Class对象。
//获取Proxy对象的方法1
Class clazzproxy1=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
Constructor constructor=clazzproxy1.getConstructor(InvocationHandler.class);//得到构造方法
class InvocationHandler1 implements InvocationHandler{//自定义一个实现InvocationHandler的类
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return null;
}
}
Collection proxy1=(Collection) constructor.newInstance(new InvocationHandler1());//得到一个proxy对象
将此方法用匿名内部类改写:
//获取Proxy对象的方法2
Class clazzproxy2=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
Collection proxy2=(Collection) constructor.newInstance(new InvocationHandler(){//用匿名内部类实现上面的代码public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { TODO Auto-generated method stubreturn null;}});
Poxy提供了一个静态方法:Proxy.newProxyInstance(loader,interface[],InvocationHandler),实现了上面所述的得到proxy对象的方法。Object proxy=Proxy.newProxyInstance(
target.getClass().getClassLoader(),//第一个参数是proxy所要指定的类加载器对象
target.getClass().getInterfaces(),//第二个参数是proxy所要实现的接口数组
new InvocationHandler() {//第三个参数是proxy构造方法中所需的参数,一个Invacation对象。
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
advicer.beforeMethod(method);
Object retVal=method.invoke(target,args);//在目标身上执行代理要求做的方法,所以目标类必须是代理类所代表的类。这里代理类代表的是Collection的子类,目标类是ArrayList
advicer.afterMethod(method);
return retVal;//method.invoke执行的执行结果传给代理
}
}
);
InvocationHandler类
InvocationHandler类中的invoke方法是关键,代理类对象每执行一次方法,就会来相应的InvocationHandler类中执行一次invoke方法,在此InvocationHandler类中的目标对象上操作任意的操作,然后返回一个Object对象给代理对象。
InvocationHandler类中public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{}proxy:接收相应的代理代理。
method:接收代理执行的方法对象。如果执行的是Object方法,那么只能是hashCode(),equals(),toString()。其余 的Object方法都不从这个InvocationHandler中过,而是直接代理自己执行。
args:接收代理执行方法的参数。
Collection proxy3=(Collection)Proxy.newProxyInstance(
Collection.class.getClassLoader(),//第一个参数是proxy所要指定的类加载器对象
new Class[]{Collection.class},//第二个参数是proxy所要实现的接口数组
new InvocationHandler() {//第三个参数是proxy构造方法中所需的参数,一个Invacation对象。
ArrayList target=new ArrayList();//目标对象,相当于这个代理就是代理它的
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
long starttime=System.currentTimeMillis();
Object retVal=method.invoke(target,args);//在目标身上执行代理要求做的方法,所以目标类必须是代理类所代表的类。这里代理类代表的是Collection的子类,目标类是ArrayList
long endtime=System.currentTimeMillis();
System.out.println(method.getName()+"running time of "+(endtime-starttime));
return retVal;//method.invoke执行的执行结果传给代理
}
}
);
proxy3.add("zxx");//动态代理对象每次执行一次方法,都会走一遍相应InvocationHandler对象中 //的invoke方法。
proxy3.add("lhm");
proxy3.add("bxd");
System.out.println(proxy3.size());
输出结果是3---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------