接口(Advice):
package com.mth.Proxy;
import java.lang.reflect.Method;
public interface Advice {
void beforMethod(Method method);
void afterMethod(Method method);
}
实现类:
package com.mth.Proxy;
import java.lang.reflect.Method;
public class AdviceImpl implements Advice {
private long begin;
@Override
public void afterMethod(Method method) {
long end = System.currentTimeMillis();
System.out.println(method.getName()+"方法运行时间 "+(begin - end));
System.out.println("after结束啦!");
}
@Override
public void beforMethod(Method method) {
System.out.println("before开始啦!");
begin = System.currentTimeMillis();
}
}
代理:
package com.mth.Proxy;
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 ProxyTest {
public static void main(String[] args) throws Exception {
System.out.println("=============获取构造方法=================");
Class clazz = Proxy.getProxyClass(Collection.class.getClassLoader(),
Collection.class);
Constructor[] constructors = clazz.getConstructors();
for (Constructor constructor : constructors) {
String name = constructor.getName();
StringBuilder sb = new StringBuilder(name);
sb.append("(");
Class[] classes = constructor.getParameterTypes();
for (int i = 0; i < classes.length; i++) {
sb.append(classes[i].getName());
sb.append(",");
}
if (classes != null && classes.length != 0) {
sb.deleteCharAt(sb.length() - 1);
}
sb.append(")");
// $Proxy0(java.lang.reflect.InvocationHandler)
System.out.println(sb);
}
System.out.println("==============获取函数===================");
Method[] Methods = clazz.getMethods();
for (Method Method : Methods) {
String name = Method.getName();
StringBuilder sb = new StringBuilder(name);
sb.append("(");
Class[] classes = Method.getParameterTypes();
for (int i = 0; i < classes.length; i++) {
sb.append(classes[i].getName());
sb.append(",");
}
if (classes != null && classes.length != 0) {
sb.deleteCharAt(sb.length() - 1);
}
sb.append(")");
// $Proxy0(java.lang.reflect.InvocationHandler)
System.out.println(sb);
}
System.out.println("==============通过构造创建实例对象===================");
// 不能使用clazz.newInstance() 因为没有不带参数的构造方法
// Constructor con2=clazz.getConstructors()[0];
Constructor con = clazz.getConstructor(InvocationHandler.class);
// 调用构造方法创建实例
Collection proxy1 = (Collection) con
.newInstance(new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
return null;
}
});
/**
* 打印结果是null 两种可能:一种是toString 返回方法是null ;二种是 创建失败为对象null
*
* 结果是toString 是null 因为proxy1.clear()不报空指针异常
*/
System.out.println(proxy1);
System.out.println("=================一步到位创建=====================");
Collection proxy3=(Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(),
new Class[] {}, new InvocationHandler() {
ArrayList target = new ArrayList();
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
return method.invoke(target, args);
}
});
System.out.println("=================通用方法获取代理=====================");
// 目标
final ArrayList target = new ArrayList();
//定义功能对象
Advice advice = new AdviceImpl();
Collection proxy2 = (Collection) getProxy(target, advice);
proxy2.add("abc");
proxy2.add("sss");
proxy2.add("vvv");
System.out.println(proxy2.size());
// 下面这句话为什么没有调用invoke方法呢?
/**
* 因为Object上面的 hashCode equals toString交给Handler 其他方法都不交给Handler
*/
// System.out.println(proxy2.getClass().getName());
}
// 通用方法
private static Object getProxy(final Object target, final Advice advice) {
Object proxy2 = Proxy.newProxyInstance(target.getClass()
.getClassLoader(),
// new Class[] { Collection.class },
target.getClass().getInterfaces(), new InvocationHandler() {
// 代理对象 代理对象那个方法 代理对象方法的参数
// proxy2 方法add 参数"abc"
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// long begin = System.currentTimeMillis();
// Object retVal = method.invoke(target, args);
// long end = System.currentTimeMillis();
// System.out.println(method.getName() + " "
// + (begin - end));
// return retVal;
advice.beforMethod(method);
Object retVal = method.invoke(target, args);
advice.afterMethod(method);
return retVal;
/**
* 下面这句话的意思是:在目标对象上面执行代理在执行的方法 ;传递给代理的参数,继续传递给目标。
*/
// return method.invoke(target, args);
}
});
return proxy2;
}
}