A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;

import com.bjsxt.proxy.Moveable;
import com.bjsxt.proxy.Tank;

public class Test1 {
        public static void main(String[] args) throws Exception{
                String rt = "\r\n";
                String src =
                        "package com.bjsxt.proxy;" +  rt +
                        "public class TankTimeProxy implements Moveable {" + rt +
                        "    public TankTimeProxy(Moveable t) {" + rt +
                        "        super();" + rt +
                        "        this.t = t;" + rt +
                        "    }" + rt +
                       
                        "    Moveable t;" + rt +
                                                       
                        "    @Override" + rt +
                        "    public void move() {" + rt +
                        "        long start = System.currentTimeMillis();" + rt +
                        "        System.out.println(\"starttime:\" + start);" + rt +
                        "        t.move();" + rt +
                        "        long end = System.currentTimeMillis();" + rt +
                        "        System.out.println(\"time:\" + (end-start));" + rt +
                        "    }" + rt +
                        "}";
                String fileName = System.getProperty("user.dir")
                                                        + "/src/com/bjsxt/proxy/TankTimeProxy.java";
                File f = new File(fileName);
                FileWriter fw = new FileWriter(f);
                fw.write(src);
                fw.flush();
                fw.close();
               
                //compile
                JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
                StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
                Iterable units = fileMgr.getJavaFileObjects(fileName);
                CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
                t.call();
                fileMgr.close();
               
                //load into memory and create an instance
                URL[] urls = new URL[] {new URL("file:/" + System.getProperty("user.dir") +"/src")};
                URLClassLoader ul = new URLClassLoader(urls);
                Class c = ul.loadClass("com.bjsxt.proxy.TankTimeProxy");
                System.out.println(c);
               
                Constructor ctr = c.getConstructor(Moveable.class);
                Moveable m = (Moveable)ctr.newInstance(new Tank());
                m.move();
               
        }
}

package com.bjsxt.compiler.test;

import java.lang.reflect.Method;

public class Test2 {
        public static void main(String[] args) {
                Method[] methods = com.bjsxt.proxy.Moveable.class.getMethods();
                for(Method m : methods) {
                        System.out.println(m.getName());
                }
        }
}
package com.bjsxt.proxy;

public interface Moveable {
        void move();
       
}

package com.bjsxt.proxy;

import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;

public class Proxy {
        public static Object newProxyInstance(Class infce, InvocationHandler h) throws Exception { //JDK6 Complier API, CGLib, ASM
                String methodStr = "";
                String rt = "\r\n";
               
                Method[] methods = infce.getMethods();
                /*
                for(Method m : methods) {
                        methodStr += "@Override" + rt +
                                                 "public void " + m.getName() + "() {" + rt +
                                                         "   long start = System.currentTimeMillis();" + rt +
                                                        "   System.out.println(\"starttime:\" + start);" + rt +
                                                        "   t." + m.getName() + "();" + rt +
                                                        "   long end = System.currentTimeMillis();" + rt +
                                                        "   System.out.println(\"time:\" + (end-start));" + rt +
                                                 "}";
                }
                */
                for(Method m : methods) {
                        methodStr += "@Override" + rt +
                                                 "public void " + m.getName() + "() {" + rt +
                                                 "    try {" + rt +
                                                 "    Method md = " + infce.getName() + ".class.getMethod(\"" + m.getName() + "\");" + rt +
                                                 "    h.invoke(this, md);" + rt +
                                                 "    }catch(Exception e) {e.printStackTrace();}" + rt +
                                               
                                                 "}";
                }
               
                String src =
                        "package com.bjsxt.proxy;" +  rt +
                        "import java.lang.reflect.Method;" + rt +
                        "public class $Proxy1 implements " + infce.getName() + "{" + rt +
                        "    public $Proxy1(InvocationHandler h) {" + rt +
                        "        this.h = h;" + rt +
                        "    }" + rt +
                       
                       
                        "    com.bjsxt.proxy.InvocationHandler h;" + rt +
                                                       
                        methodStr +
                        "}";
                String fileName =
                        "d:/src/com/bjsxt/proxy/$Proxy1.java";
                File f = new File(fileName);
                FileWriter fw = new FileWriter(f);
                fw.write(src);
                fw.flush();
                fw.close();
               
                //compile
                JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
                StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
                Iterable units = fileMgr.getJavaFileObjects(fileName);
                CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
                t.call();
                fileMgr.close();
               
                //load into memory and create an instance
                URL[] urls = new URL[] {new URL("file:/" + "d:/src/")};
                URLClassLoader ul = new URLClassLoader(urls);
                Class c = ul.loadClass("com.bjsxt.proxy.$Proxy1");
                System.out.println(c);
               
                Constructor ctr = c.getConstructor(InvocationHandler.class);
                Object m = ctr.newInstance(h);
                //m.move();

                return m;
        }
}

package com.bjsxt.proxy;

import java.util.Random;


public class Tank implements Moveable {

        @Override
        public void move() {
               
                System.out.println("Tank Moving...");
                try {
                        Thread.sleep(new Random().nextInt(10000));
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
               
        }

       
       
}

package com.bjsxt.proxy;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TimeHandler implements InvocationHandler{
       
        private Object target;



        public TimeHandler(Object target) {
                super();
                this.target = target;
        }



        @Override
        public void invoke(Object o, Method m) {
                long start = System.currentTimeMillis();
                System.out.println("starttime:" + start);
                System.out.println(o.getClass().getName());
                try {
                        m.invoke(target);
                } catch (Exception e) {
                        e.printStackTrace();
                }
                long end = System.currentTimeMillis();
                System.out.println("time:" + (end-start));
        }

}

package com.bjsxt.proxy;

import java.lang.reflect.Method;

public interface InvocationHandler {
        public void invoke(Object o, Method m);
}

package com.bjsxt.proxy;


public class Client {
        public static void main(String[] args) throws Exception {
                Tank t = new Tank();
                InvocationHandler h = new TimeHandler(t);
               
                Moveable m = (Moveable)Proxy.newProxyInstance(Moveable.class, h);
               
                m.move();
        }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马