Proxy
getProxyClass(ClassLoader loader, Class<?>... interfaces)
创建动态类及查看其方法列表信息
ProxyTest.java
public class ProxyTest {
public static void main(String[] args) {
//这是一个字节码
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
// System.out.println(clazzProxy1.getName());
System.out.println("begin construtcor list ================================================ ");
Constructor[] constructors = clazzProxy1.getConstructors();
for (Constructor constructor : constructors) {
String conName = constructor.getName();
StringBuilder stringBuilder = new StringBuilder(conName);
stringBuilder.append("(");
Class[] clazzParams = constructor.getParameterTypes();
for (Class clazzParam : clazzParams) {
stringBuilder.append(clazzParam.getName()).append('|');
}
if (clazzParams != null && clazzParams.length != 0) {
stringBuilder.deleteCharAt(stringBuilder.length()-1);
}
stringBuilder.append(")");
System.out.println(stringBuilder.toString());
}
System.out.println("end construtcor list ================================================ ");
// System.out.println(clazzProxy1.getName());
System.out.println("begin methods list ================================================ ");
Method[] methods = clazzProxy1.getMethods();
for (Method method : methods) {
String conName = method.getName();
StringBuilder stringBuilder = new StringBuilder(conName);
stringBuilder.append("(");
Class[] clazzParams = method.getParameterTypes();
for (Class clazzParam : clazzParams) {
stringBuilder.append(clazzParam.getName()).append('|');
}
if (clazzParams != null && clazzParams.length != 0) {
stringBuilder.deleteCharAt(stringBuilder.length()-1);
}
stringBuilder.append(")");
System.out.println(stringBuilder.toString());
}
System.out.println("end methods list ================================================ ");
}
}
创建动态类的实例对象及调用其方法
System.out.println("begin create instanse list ================================================ ");
Collection proxy1 = (Collection)constructor.newInstance(new myInvocationHandler1());
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
class myInvocationHandler1 implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return null;
}
};
Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-gener
ated method stub
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 {
// ArrayList target = new ArrayList();
long beginTime = System.currentTimeMillis();
Object retVal = method.invoke(target, args);
long endTime = System.currentTimeMillis();
System.out.println(method.getName() + " running time == " + (endTime-beginTime));
return retVal;
}
});
proxy3.add("ddd");
proxy3.add("aaa");
proxy3.add("vvv");
System.out.println(proxy1.toString());
System.out.println(proxy2.toString());
System.out.println(proxy3.toString());
System.out.println(proxy3.size());
System.out.println("end create instanse list ================================================ ");
规范的动态生成代理 相当于一个小框架aop
Advice.java
public interface Advice {
void beforeMethod(Method method);
void afterMethod(Method method);
}
MyAdvice.java
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();
}
}
ProxyTest .java
public class ProxyTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println(clazzProxy1.getName());
System.out.println("----------begin constructors list----------");
/*$Proxy0()
$Proxy0(InvocationHandler,int)*/
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!=null && clazzParams.length != 0)
sBuilder.deleteCharAt(sBuilder.length()-1);
sBuilder.append(')');
System.out.println(sBuilder.toString());
}
System.out.println("----------begin methods list----------");
/*$Proxy0()
$Proxy0(InvocationHandler,int)*/
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!=null && clazzParams.length != 0)
sBuilder.deleteCharAt(sBuilder.length()-1);
sBuilder.append(')');
System.out.println(sBuilder.toString());
}
System.out.println("----------begin create instance object----------");
//Object obj = clazzProxy1.newInstance();
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
class MyInvocationHander1 implements 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 MyInvocationHander1());
System.out.println(proxy1);
proxy1.clear();
//proxy1.size();
//System.out.println("111111111111111");
Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}
});
final ArrayList target = new ArrayList();
Collection proxy3 = (Collection)getProxy(target,new MyAdvice());
proxy3.add("zxx");
proxy3.add("lhm");
proxy3.add("bxd");
System.out.println(proxy3.size());
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(){
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;
}
}