--------------------------------模拟JDK proxy ---------------------------
public class MyProxy {
public static Object newInstance(Class<?> inface,InvocationHandler h) throws Exception {
String rt = "\r\n";
String packageName = inface.getPackage().getName();
String infaceName = inface.getName();
String proxyName = "Proxy"+System.currentTimeMillis();
String methodStr = "";
String constrantorStr = " public " + proxyName + "(" +InvocationHandler.class.getName()
+ " h){" + rt + "this.h = h;" + rt + "}";
Method[] methods = inface.getMethods();
for (Method m : methods) {
System.out.println(m);
Class[] clazzs = m.getParameterTypes();
String params = "";
for (int i = 0; i < clazzs.length; i++) {
params += (clazzs[i].getName() + "param" + i + " ");
}
/* methodStr += " public " + m.getReturnType().getName() + " "
+ m.getName() + "(" + params + "){" + rt
+ "Long start = System.currentTimeMillis();" + rt + "m."
+ m.getName() +"();"+ rt
+ "Long end = System.currentTimeMillis();" + rt
+ "System.out.println(\"run time:\" + (end - start));" + rt
+ "}";*/
methodStr +=" public " + m.getReturnType().getName() + " "
+ m.getName() + "(" + params + "){" + rt
+ " try{Method md = " + inface.getName() + ".class.getMethod(\""+m.getName()+"\");" + rt
+ "h.invoke(this,md);}catch(Exception e){}"+ rt
+ "}";
}
String src = "package " + packageName + ";" + rt
+ "import java.lang.reflect.Method;" + rt
+ "public class "
+ proxyName + " implements " + infaceName + " {" + rt
+ "private " + InvocationHandler.class.getName() + " h;" + rt + constrantorStr + rt
+ methodStr + rt + "}";
String fileName = System.getProperty("user.dir") + "\\src\\com\\proxy\\demo\\"+proxyName+".java"; //拿到项目路径 拼接文件名
File f = new File(fileName);
FileWriter fw = new FileWriter(f);
fw.write(src);
fw.flush();
fw.close();
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();//拿到系统默认的 .java文件编译器
StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null); //拿到文件管理对象
Iterable units = fm.getJavaFileObjects(fileName); //要编译的单元 可以一次编译多个文件
CompilationTask task = compiler.getTask(null, fm, null, null, null, units);//创建编译任务
task.call();
URL[] urls = new URL[]{new URL("file:/"+System.getProperty("user.dir") + "/src/")};
URLClassLoader cl = new URLClassLoader(urls);
Class clazz = cl.loadClass("com.proxy.demo."+proxyName);//加载进内存产生class对象
Constructor constructor = clazz.getConstructor(InvocationHandler.class);
return constructor.newInstance(h);
}
}
-----------------------------模拟JDK InvocationHandler------------------------
public interface InvocationHandler {
void invoke(Object o, Method m);
}
-----------------------------对方法进行什么样的代理------------------------------
public class TimerHandler implements InvocationHandler {
private Object target;//被代理的对象
public void invoke(Object o, Method m) {
long start = System.currentTimeMillis();
System.out.println("startTime:" + start);
try {
m.invoke(target, new Object[]{});
} catch (Exception e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("time:" +( end - start));
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
}
public void myInterceptor(){
UserDao userDao = new UserDaoImpl();
LogInvocationHandler h = new LogInvocationHandler(userDao);
UserDao proxy = (UserDao)
Proxy.
newProxyInstance
(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),h);
proxy.save(new User());
}
--------------------------调用处理器--------------------------------
public class LogInvocationHandler implements InvocationHandler {
private Object target;
public LogInvocationHandler(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(method.getName() + " run");
method.invoke(target, args);
System.out.println("run over");
return null;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
}