package com.dianping.pigeon.remoting.test; import com.dianping.pigeon.remoting.invoker.proxy.GroovyScriptInvocationProxy; import com.dianping.pigeon.remoting.invoker.proxy.MockInvocationUtils; import com.dianping.pigeon.remoting.invoker.proxy.MockProxyWrapper; import com.dianping.pigeon.util.ClassUtils; import groovy.lang.*; import org.codehaus.groovy.control.CompilerConfiguration; import org.junit.Test; import org.springframework.aop.support.AopUtils; import java.io.File; import java.io.IOException; import java.lang.reflect.Proxy; import java.util.Random; /** * Created by chenchongze on 16/9/21. */ public class GroovyTest { private static final ThreadLocal<GroovyShell> groovyShellThreadLocal = new ThreadLocal<GroovyShell>() { @Override protected GroovyShell initialValue() { return new GroovyShell(Thread.currentThread().getContextClassLoader()); } }; @Test public void testStatic() { StaticEx.pti(1); try { System.in.read(); } catch (IOException e) { e.printStackTrace(); } } @Test public void testRan() { for (int i = 0; i < 50; i++) { System.out.println(new Random().nextInt(2) < 1); } } @Test public void test0() { //String script = "return 'mock groovy';"; String script = "throw new RuntimeException('run ex');"; try { Script groovyScript = getGroovyScript(script); EchoService echoService = (EchoService)Proxy.newProxyInstance(ClassUtils.getCurrentClassLoader(null), new Class[]{EchoService.class}, new GroovyScriptInvocationProxy(groovyScript)); System.out.println(AopUtils.isJdkDynamicProxy(echoService)); System.out.println(echoService.getClass().getSuperclass()); if (AopUtils.isAopProxy(echoService)) { System.out.println(echoService.getClass().getSuperclass()); } //System.out.println(echoService); MockProxyWrapper mockProxyWrapper = new MockProxyWrapper(echoService); System.out.println(mockProxyWrapper.invoke("echo", new Class[]{String.class}, new Object[]{"ddd"})); //System.out.println("cache script"); //System.out.println(groovyScript.run()); } catch (Throwable t) { System.out.println(t.toString()); } } @Test public void test1() { String script = "return new com.dianping.pigeon.remoting.test.Person(name:'ccz',age:20);"; try { Script groovyScript = getGroovyScript(script); System.out.println("cache script"); System.out.println(groovyScript.run()); } catch (Throwable t) { System.out.println(t.toString()); } } /** * 基于groovy shell * @param script * @return * @throws Throwable */ public static Object parseGroovyScript(String script) throws Throwable { return new GroovyShell().evaluate(script); } public static Script getGroovyScript(String script) throws Throwable { return groovyShellThreadLocal.get().parse(script); } @Test public void test2() { String script = "new com.dianping.pigeon.remoting.test.Person(name:'ccz',age:20);"; try { System.out.println(parse(script)); parse(); } catch (Throwable t) { System.out.println(t.toString()); } } /** * 基于groovy class loader * @param script * @return * @throws Throwable */ public static Object parse(String script) throws Throwable { GroovyClassLoader classLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader()); GroovyCodeSource groovyCodeSource = new GroovyCodeSource( "class GroovyRun {\n\tObject run(String s1, String s2) {\n\t\tprintln s1+s2;" + script + "\n\t}\n}", "Groovy",""); Class testGroovyClass = classLoader.parseClass(groovyCodeSource); GroovyObject instance = (GroovyObject) testGroovyClass.newInstance();//proxy return instance.invokeMethod("run", new Object[]{"aaa", "bbb"}); } @Test public void test11() { Binding binding = new Binding(); CompilerConfiguration config = new CompilerConfiguration(); config.setScriptBaseClass("com.dianping.pigeon.remoting.test.MyScript");//MyScript.groovy文件默认在src目录下 GroovyShell shell = new GroovyShell(Thread.currentThread().getContextClassLoader(), binding, config); Person person1 = (Person) shell.evaluate("customScript()");//执行MyScript.groovy脚本的test1方法(非私有) System.out.println(person1);//输出返回的对象 } public static void parse() throws Exception { GroovyClassLoader classLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader()); File sourceFile = new File("/Users/chenchongze/Documents/Person.groovy"); Class testGroovyClass = classLoader.parseClass(new GroovyCodeSource(sourceFile)); GroovyObject instance = (GroovyObject)testGroovyClass.newInstance();//proxy instance.setProperty("name", "ccz"); instance.invokeMethod("setAge", 20L); String str = (String)instance.invokeMethod("toString", null); System.out.println(str); System.out.println(instance.getMetaClass().getTheClass().getCanonicalName()); Class.forName(instance.getMetaClass().getTheClass().getCanonicalName()); //here instance = null; testGroovyClass = null; } }