
package casic.com.base.proxytest;
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;
/**
* Copyright © 2018 eSunny Info. Tech Ltd. All rights reserved.
*
* @Package: casic.com.base.proxytest
* @author: lh
* @date: 2018年5月2日 下午8:57:41
*/
public class ProxyTest {
public static void main(String[] args) throws Exception{
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println(clazzProxy1.getName());
System.out.println("------------begin constructors list--------------- ");
Constructor[] constructors = clazzProxy1.getConstructors();
for(Constructor constructor : constructors) {
String name = constructor.getName();
StringBuilder sBuilder = new StringBuilder(name);
sBuilder.append('(');
Class[] clazzParams = constructor.getParameterTypes();
for (Class clazzParam : clazzParams) {
sBuilder.append(clazzParam.getName()).append(',');
}
if(clazzParams.length != 0 && clazzParams != null) {
sBuilder.deleteCharAt(sBuilder.length() - 1);
}
sBuilder.append(')');
System.out.println(sBuilder.toString());
}
System.out.println("------------end constructors list--------------- ");
System.out.println("------------begin Method list--------------- ");
Method[] methods = clazzProxy1.getMethods();
for(Method method : methods) {
String name = method.getName();
StringBuilder sBuilder = new StringBuilder(name);
sBuilder.append('(');
Class[] clazzParams = method.getParameterTypes();
for (Class clazzParam : clazzParams) {
sBuilder.append(clazzParam.getName()).append(',');
}
if(clazzParams.length != 0 && clazzParams != null) {
sBuilder.deleteCharAt(sBuilder.length() - 1);
}
sBuilder.append(')');
System.out.println(sBuilder.toString());
}
System.out.println("------------end Method list--------------- ");
System.out.println("------------start create instance--------------- ");
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
class MyInvocationHandler1 implements InvocationHandler{
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
}
Collection proxy1 =(Collection)constructor.newInstance(new MyInvocationHandler1());
//proxy1 的toString() 方法返回值是null
System.out.println(proxy1);
System.out.println(proxy1.toString());
proxy1.clear();//调用无返回值的方法不报错
//proxy1.size();//调用有返回值的方法报错
System.out.println("------------start create instance--------------- ");
Collection proxy2 =(Collection)constructor.newInstance(new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});
Collection proxy3 = (Collection)Proxy.newProxyInstance(
Collection.class.getClassLoader(),
new Class[] { Collection.class},
new InvocationHandler() {
ArrayList target = new ArrayList();
@Override
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() +"运行时间为" + (endTime - beginTime));
//return method.invoke(proxy, args); //死循环
return retVal;
}
});
proxy3.add("11");
proxy3.add("22");
proxy3.add("33");
System.out.println(proxy3.size());
}
}