手写JAVA动态代理

代码目录:

具体类:

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);
}

}

猜你喜欢

转载自blog.csdn.net/wflovejava/article/details/85059909