标签:
一、动态代理生成类
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import com.proxy.invocation.InvocationHandler;
public class Proxy {
private static String rt = "\r\n";
private static String porjectPath = System.getProperty("user.dir");
private static String fileName = "$Proxy1";
private static String handlerClass = "com.proxy.invocation.InvocationHandler";
public static <T> T newProxyInstance(Class<T> clazz, InvocationHandler invocation) {
StringBuffer proxyClass = Proxy.getProxyClass(clazz);
Proxy.createClass(clazz , proxyClass.toString() , fileName+".java");
Proxy.compilerClass(clazz,fileName);
return Proxy.loadClass(clazz,fileName,invocation);
}
//生成代理类内容
private static StringBuffer getProxyClass(Class clazz) {
StringBuffer strB = new StringBuffer();
strB.append(clazz.getPackage() +";"+rt+rt);
strB.append("import java.lang.reflect.Method;"+rt + rt);
strB.append("public class " + fileName + " extends "+clazz.getName()+" {"+rt + rt);
strB.append(" private "+handlerClass + " h;" + rt+ rt);
strB.append(" public "+fileName+"("+ handlerClass +" h){"+rt);
strB.append(" this.h = h;" + rt);
strB.append(" }" + rt + rt);
Method[] methods = clazz.getDeclaredMethods();
for(Method m : methods){
strB.append(" @Override"+rt);
Class returnType = m.getReturnType();
String Modifiers = Modifier.toString(m.getModifiers());
//获取方法参数及类型,并包装成各种字符串
Class[] paramTypes = m.getParameterTypes();
StringBuffer params = new StringBuffer();
StringBuffer paramsClass = new StringBuffer();
StringBuffer paramsName = new StringBuffer();
for(int i = 0,length = paramTypes.length;i < length;i++){
Class paramClass = paramTypes[i];
if(params.length()>0){
paramsName.append(',');
params.append(',');
}
String paramName = "arg"+i;
paramsName.append(paramName);
paramsClass.append(','+paramClass.getName()+".class");
params.append(paramClass.getName()+" "+paramName);
}
//生成代理方法
strB.append(" "+Modifiers+" "+ returnType.getName()+" "+ m.getName() + "("+params+"){" + rt);
strB.append(" Object[] params = new Object[]{"+paramsName+"};"+rt);
if("void"!=returnType.getName()){
strB.append(" "+returnType.getName()+" returnValue = null;"+rt);
}
strB.append(" try {"+rt);
strB.append(" Method m = " + clazz.getName()+".class.getMethod(\""+m.getName()+"\""+paramsClass+");"+rt);
//判断代理方法是否有返回值,据此调用不同方法
if("void"!=returnType.getName()){
strB.append(" returnValue = ("+returnType.getName()+")h.invokeObj(this,m,params);" + rt);
}else{
strB.append(" h.invokeVoid(this,m,params);" + rt);
}
strB.append(" } catch (NoSuchMethodException | SecurityException e) {"+rt);
strB.append(" e.printStackTrace();"+rt);
strB.append(" }"+rt);
if("void"!=returnType.getName()){
strB.append(" return returnValue;"+rt);
}
strB.append(" }"+rt + rt);
}
strB.append("}"+rt);
return strB;
}
//生成.java源文件
private static void createClass(Class orignalClass , String classContend , String fileName) {
String packagePath = orignalClass.getPackage().getName().replace('.', '/');//将包路径转为文件路径
File newClass = new File(porjectPath + "/src/"+ packagePath + "/" + fileName);
FileWriter fw = null;
try {
fw = new FileWriter(newClass);
fw.write(classContend);
fw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != fw) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 编译class文件
private static void compilerClass(Class clazz,String fileName) {
String packagePath = clazz.getPackage().getName().replace('.', '\\');
String srcFile = porjectPath + "\\src\\"+ packagePath + "\\" + fileName+".java";
String classOutputFolder = porjectPath + "\\bin";
JavaCompiler compiler = null;
StandardJavaFileManager fileMgr = null;
Iterable units = null;
Iterable options = null;
CompilationTask t = null;
try {
compiler = ToolProvider.getSystemJavaCompiler();
fileMgr = compiler.getStandardFileManager(null, null, null);
units = fileMgr.getJavaFileObjects(srcFile);
options = Arrays.asList("-d", classOutputFolder);//生成位置
t = compiler.getTask(null, fileMgr, null, options, null, units);
t.call();
fileMgr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//加载编译的class至内存中
@SuppressWarnings("unchecked")
private static <T> T loadClass(Class<T> clazz,String fileName, InvocationHandler invocation){
T instance = null;
try {
URL[] urls = new URL[] {new URL("file:\\"+porjectPath+"\\bin\\")};
URLClassLoader ul = new URLClassLoader(urls);
Class c = ul.loadClass(clazz.getPackage().getName()+"."+fileName);
Constructor constructor = c.getConstructor(Class.forName(handlerClass));
instance = (T) constructor.newInstance(invocation);
} catch (Exception e) {
e.printStackTrace();
}
return instance;
}
}标签:
原文地址:http://blog.csdn.net/sw_san/article/details/51348787