代码目录:

具体类:
public interface UserDao {
public void query(String s);
}
public class UserDaoImpl implements UserDao{
private UserDao userDao;
public UserDaoImpl(){
}
public UserDaoImpl( UserDao userDao){
this.userDao = userDao;
}
public void query(String s){
System.out.println("query");
}
}
/**
* @author wufei
* @create 2018-12-17 15:51
**/
public class ProxyUtil
{
public static Object newInstance(Class targetInfo) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException {
StringBuilder context = new StringBuilder();
String line = "\n";
String tab = "";
//包名
String packageContext = "package com.wf.springdemo.proxy;"+line;
//导入包名
String importContext = "import "+targetInfo.getName()+";"+line;
String targetNameInfo = targetInfo.getSimpleName();
//代理类名
String proxyClassName = "public class $Proxy implements "+targetNameInfo+"{"+line;
String fieldContext = "private "+targetNameInfo+" target;"+line;
//构造函数
String constructorContext = "public $Proxy ("+targetNameInfo+" target){" +line+
"this.target = target; "+line+"}"+line;
//方法
String methodContext = "";
Method[] methods = targetInfo.getDeclaredMethods();
for (Method method : methods) {
//方法返回值类型
String methodReturnType = method.getReturnType().getName();
//方法名
String methodName = method.getName();
//参数类型
Class[] parameterTypes = method.getParameterTypes();
String argsContext = "";
//参数名称
String parameterName="p";
int p =1;
for (Class parameterType : parameterTypes) {
//String p1, String p2
parameterName = parameterName+p;
argsContext=parameterType.getSimpleName()+" "+parameterName+"";
p++;
}
//取出逗号,
System.out.println("argsContext = [" + argsContext + "]");
String argsContext1 = "";
// if(argsContext.length()>0){
// argsContext1= argsContext.substring(0,argsContext.lastIndexOf(",")-1);
// }
methodContext +="public "+ methodReturnType+" "+methodName+"("+argsContext+"){"+line
+"System.out.println(\"query\");"+line //业务逻辑比较复杂了 不处理了
+"target."+methodName+"("+parameterName+");"+line+"}"+line;
}
context.append(packageContext);
context.append(importContext);
context.append(proxyClassName);
context.append(fieldContext);
context.append(constructorContext);
context.append(methodContext);
context.append(line+"}");
System.out.println("result: \n"+context.toString());
//输出到磁盘,jdk是内存上
File file = new File("D:\\test\\$Proxy.java");
if(file.exists()){
file.createNewFile();
}
FileWriter fileWriter = new FileWriter(file);
fileWriter.write(context.toString());
fileWriter.flush();
fileWriter.close();
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager standardJavaFileManager = compiler.getStandardFileManager(null,null,null);
Iterable units = standardJavaFileManager.getJavaFileObjects(file);
JavaCompiler.CompilationTask t = compiler.getTask(null,standardJavaFileManager,null,null,null,units);
t.call();
standardJavaFileManager.close();
URL[] urls = new URL[]{new URL("file:d\\\\")};
URLClassLoader urlClassLoader = new URLClassLoader(urls);
Class aClass = urlClassLoader.loadClass("com.wf.springdemo.proxy.$Proxy");
return aClass.newInstance();
}
}
public class Main {
public static void main(String[] args) {
try {
UserDao userDao = null;
try {
userDao = (UserDao) ProxyUtil.newInstance(UserDao.class);
userDao.query("ok");
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
生成的代理类:
package com.wf.springdemo.proxy;
import com.wf.springdemo.proxy.UserDao;
public class $Proxy implements UserDao{
private UserDao target;
public $Proxy (UserDao target){
this.target = target;
}
public void query(String p1){
System.out.println("query");
target.query(p1);
}
}
482

被折叠的 条评论
为什么被折叠?



