问答详情
源自:3-2 完善动态代理实现

IllegalArgumentException

http://img4.mukewang.com/5e50c57b00011c7d09940155.jpg

package myproxy;

import org.apache.commons.io.FileUtils;

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Proxy {
    public static Object newProxyInstance(Class infce) throws Exception {
        String rt = "\r\n";
        String methodStr = "";
        for(Method m : infce.getMethods()){
            methodStr += " @Override" + rt +
                    "  public void " + m.getName() + "() {" + rt +
                    "     long starttime = System.currentTimeMillis();" + rt +
                    "     System.out.println(\"汽车开始行驶....\");" + rt +
                    "     m." + m.getName() + "();" + rt +
                    "     long endtime = System.currentTimeMillis();" + rt +
                    "     System.out.println(\"汽车结束行驶....  汽车行驶时间:\" " + rt +
                    "           + (endtime - starttime) + \"毫秒!\");" + rt +
                    "  }" ;
        }

        String str =
                "package myproxy;" + rt +
                        "public class $Proxy0 implements " + infce.getSimpleName()+ " {" + rt +
                        "  public $Proxy0(" + infce.getSimpleName() + " m) {" + rt +
                        "     super();" + rt +
                        "     this.m = m;" + rt +
                        "  }" + rt +
                        "  private " + infce.getSimpleName() + " m;" + rt +
                        methodStr + rt +
                        "}" ;

        //产生代理类的java文件
        String filename = System.getProperty("user.dir") +"/src/myproxy/$Proxy0.java";
        File file = new File(filename);
        FileUtils.writeStringToFile(file, str);

        //编译
        //拿到编译器
        JavaCompiler complier = ToolProvider.getSystemJavaCompiler();
        //文件管理者
        StandardJavaFileManager fileMgr =
                complier.getStandardFileManager(null, null, null);
        //获取文件
        Iterable units = fileMgr.getJavaFileObjects(filename);
        //编译任务
        JavaCompiler.CompilationTask t = complier.getTask(null, fileMgr, null, null, null, units);
        //进行编译
        t.call();
        fileMgr.close();

        //load 到内存
        ClassLoader cl = ClassLoader.getSystemClassLoader();
        Class c = cl.loadClass("myproxy.$Proxy0");

        Constructor ctr = c.getConstructor(infce);
        return ctr.newInstance(new Car());

    }
}

大家能帮忙看看哪里出问题了吗

提问者:XuLiDown 2020-02-22 14:09

个回答