代码目录:
具体类:
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); } }