方法调用代理代码改进
近期一直在学习方法调用之类的问题,下午正好有机会和大家讨论一下.
package cn.itcast.day3;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
public class ProxtTest {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
final ArrayList target=new ArrayList();
//直接用newProxyInstance方法创立一个象对
Collection proxy3 = (Collection )getProxy(target,new MyAdvice());
//每调用一次意任方法会都找proxy3象对身上Handler的invoke()方法;
Object obj=proxy3.add("zxx");
System.out.println(obj);
proxy3.add("lhm");
proxy3.add("flx");
System.out.println(proxy3.size());
//getClass()为从Object继承的方法,从Object继承的方法中只有
//调用hashCode(),equals(),toString()这三种方法才转到invoke(),其余的不转
System.out.println(proxy3.getClass().getName());
}
private static Object getProxy(final Object target,final Advice advice) {
Object proxy3=Proxy.newProxyInstance(
target.getClass().getClassLoader(),
/*new Class[]{Collection.class},*/
target.getClass().getInterfaces(),
new InvocationHandler(){
//参数的义意:proxy:理代的象对,method:理代象对调用的方法,args:理代象对调用的方法中传入的参数
//比如:proxy3.add("zxx");则proxy为proxy3,method为add(),args数组中据数为zxx.
//invoke()方法返回的参数反给理代象对
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
/*long beginTime=System.currentTimeMillis();
Object retVal=method.invoke(target, args);
long endTime=System.currentTimeMillis();
System.out.println(method.getName()+" running time of "+(endTime-beginTime));
return retVal;*/
advice.beforeMethod(method);
Object retVal=method.invoke(target, args);
advice.afterMethod(method);
return retVal;
}
});
return proxy3;
}
}
package cn.itcast.day3;
import java.lang.reflect.Method;
public interface Advice {
void beforeMethod(Method method);
void afterMethod(Method method);
}
package cn.itcast.day3;
import java.lang.reflect.Method;
public class MyAdvice implements Advice {
long beginTime = 0;
public void afterMethod(Method method) {
// TODO Auto-generated method stub
System.out.println("从传智客播结业下班啦!");
long endTime = System.currentTimeMillis();
System.out.println(method.getName() + " running time of " + (endTime - beginTime));
}
public void beforeMethod(Method method) {
// TODO Auto-generated method stub
System.out.println("到传智客播来学习啦!");
beginTime = System.currentTimeMillis();
}
}
文章结束给大家分享下程序员的一些笑话语录:
关于编程语言
如果 C++是一把锤子的话,那么编程就会变成大手指头。
如果你找了一百万只猴子来敲打一百万个键盘,那么会有一只猴子会敲出一 段 Java 程序,而其余的只会敲出 Perl 程序。
一阵急促的敲门声,“谁啊!”,过了 5 分钟,门外传来“Java”。
如果说 Java 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。