模拟JDK动态代理

--------------------------------模拟JDK  proxy ---------------------------
public class MyProxy {
    public static Object newInstance(Class<?> inface,InvocationHandler h) throws Exception {
        String rt = "\r\n";
        String packageName = inface.getPackage().getName();
        String infaceName = inface.getName();
        String proxyName = "Proxy"+System.currentTimeMillis();
        String methodStr = "";
        String constrantorStr = " public " + proxyName + "(" +InvocationHandler.class.getName()
                + " h){" + rt + "this.h = h;" + rt + "}";
        Method[] methods = inface.getMethods();
        for (Method m : methods) {
            System.out.println(m);
            Class[] clazzs = m.getParameterTypes();
            String params = "";
            for (int i = 0; i < clazzs.length; i++) {
                params += (clazzs[i].getName() + "param" + i + " ");
            }
    /*        methodStr += " public " + m.getReturnType().getName() + " "
                    + m.getName() + "(" + params + "){" + rt
                    + "Long start  = System.currentTimeMillis();" + rt + "m."
                    + m.getName() +"();"+ rt
                    + "Long end = System.currentTimeMillis();" + rt
                    + "System.out.println(\"run time:\" + (end - start));" + rt
                    + "}";*/
            methodStr +=" public " + m.getReturnType().getName() + " "
                    + m.getName() + "(" + params + "){" + rt
                    + " try{Method md = " + inface.getName() + ".class.getMethod(\""+m.getName()+"\");" + rt
                    + "h.invoke(this,md);}catch(Exception e){}"+ rt
                    + "}";
        }
        String src = "package " + packageName + ";" + rt
                + "import java.lang.reflect.Method;" + rt
                + "public class "
                + proxyName + " implements " + infaceName + " {" + rt
                + "private " + InvocationHandler.class.getName() + " h;" + rt + constrantorStr + rt
                + methodStr + rt + "}";
        String fileName = System.getProperty("user.dir") + "\\src\\com\\proxy\\demo\\"+proxyName+".java"//拿到项目路径 拼接文件名
        File f = new File(fileName);
        FileWriter fw = new FileWriter(f);
        fw.write(src);
        fw.flush();
        fw.close();
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();//拿到系统默认的 .java文件编译器
        StandardJavaFileManager fm = compiler.getStandardFileManager(nullnullnull); //拿到文件管理对象
        Iterable units = fm.getJavaFileObjects(fileName); //要编译的单元  可以一次编译多个文件
        CompilationTask task = compiler.getTask(null, fm, nullnullnullunits);//创建编译任务
        task.call();
        URL[] urls = new URL[]{new URL("file:/"+System.getProperty("user.dir") + "/src/")};
        URLClassLoader cl = new URLClassLoader(urls);
        Class clazz = cl.loadClass("com.proxy.demo."+proxyName);//加载进内存产生class对象
        Constructor constructor  = clazz.getConstructor(InvocationHandler.class);
        return constructor.newInstance(h);
    }
}
-----------------------------模拟JDK InvocationHandler------------------------
public interface InvocationHandler {
    void invoke(Object o, Method m);
}  

-----------------------------对方法进行什么样的代理------------------------------
public class TimerHandler implements InvocationHandler {
    
    private Object target;//被代理的对象
    
    public void invoke(Object o, Method m) {
        long start = System.currentTimeMillis();
        System.out.println("startTime:" + start);
        try {
            m.invoke(targetnew Object[]{});
        } catch (Exception e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println("time:" +( end - start));
    }
    public Object getTarget() {
        return target;
    }
    public void setTarget(Object target) {
        this.target = target;
    }
}  
    public void myInterceptor(){
        UserDao userDao = new UserDaoImpl();
        LogInvocationHandler h = new LogInvocationHandler(userDao);
        UserDao proxy = (UserDao)       Proxy. newProxyInstance (userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),h);
        proxy.save(new User());
    }

--------------------------调用处理器--------------------------------
public class LogInvocationHandler implements InvocationHandler {
    private Object target;
    
    public LogInvocationHandler(Object target) {
        super();
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println(method.getName() + " run");
        method.invoke(target, args);
        System.out.println("run over");
        return null;
    }
    public Object getTarget() {
        return target;
    }
    public void setTarget(Object target) {
        this.target = target;
    }
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值