package sun.testProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import org.junit.Test; public class TestProxy { @Test public void testProxy() { Hello helloProxy = new HelloProxy(); helloProxy.say("Sun"); } @Test //动态代理:要代理的类必须要有实现接口 public void testDynamicProxy(){ Hello hello = new HelloImpl(); DynamicProxy dynamicProxy = new DynamicProxy(hello); Hello helloProxy = (Hello) Proxy.newProxyInstance( hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), dynamicProxy); helloProxy.say("Sun"); } @Test //测试封装Proxy获取方法后的情况 public void testDynamicProxyPackage(){ Hello hello = new HelloImpl(); DynamicProxy dynamicProxy = new DynamicProxy(hello); Hello helloProxy = dynamicProxy.getProxy(); helloProxy.say("Sun"); } @Test //方法级别的代理,不用实现接口 public void testCGLibProxy(){ CGLibProxy cgLibProxy = new CGLibProxy(); HelloImpl helloProxy = cgLibProxy.getProxy(HelloImpl.class); helloProxy.say("Sun"); } } /** * 接口 * @author Administrator */ interface Hello{ void say(String name); } /** * 实现类 * @author Administrator */ class HelloImpl implements Hello{ @Override public void say(String name) { System.out.println("Hello!" + name); } } //代理类(静态代理) class HelloProxy implements Hello{ private HelloImpl helloImpl; public HelloProxy() { helloImpl = new HelloImpl(); } @Override public void say(String name) { before(); helloImpl.say(name); after(); } private void after() { System.out.println("After...."); } private void before() { System.out.println("before..."); } } //动态代理 class DynamicProxy implements InvocationHandler{ private Object target; public DynamicProxy(Object target) { this.target = target; } @SuppressWarnings("unchecked") public <T> T getProxy(){ return (T) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); Object result = method.invoke(target, args); method.invoke(target, args); after(); return result; } private void after() { System.out.println("After...."); } private void before() { System.out.println("before..."); } } /** * CGLib代理 * @author Administrator */ class CGLibProxy implements MethodInterceptor{ @SuppressWarnings("unchecked") public <T> T getProxy(Class<T> cls){ return (T) Enhancer.create(cls, this); } @Override public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { before(); Object result = arg3.invoke(arg0, arg2); after(); return result; } private void after() { System.out.println("After...."); } private void before() { System.out.println("before..."); } }
报错:
java.lang.StackOverflowError at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:446) at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:517) at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544) at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252) at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106) at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190) at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111) at java.io.PrintStream.write(PrintStream.java:476) at java.io.PrintStream.print(PrintStream.java:619) at java.io.PrintStream.println(PrintStream.java:756) at sun.testProxy.CGLibProxy.before(TestProxy.java:145) at sun.testProxy.CGLibProxy.intercept(TestProxy.java:135) at sun.testProxy.HelloImpl$$EnhancerByCGLIB$$7ac88992.say(<generated>) at sun.testProxy.HelloImpl$$FastClassByCGLIB$$bcd464de.invoke(<generated>) at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at sun.testProxy.CGLibProxy.intercept(TestProxy.java:136) at sun.testProxy.HelloImpl$$EnhancerByCGLIB$$7ac88992.say(<generated>) at sun.testProxy.HelloImpl$$FastClassByCGLIB$$bcd464de.invoke(<generated>) at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at sun.testProxy.CGLibProxy.intercept(TestProxy.java:136) at sun.testProxy.HelloImpl$$EnhancerByCGLIB$$7ac88992.say(<generated>) at sun.testProxy.HelloImpl$$FastClassByCGLIB$$bcd464de.invoke(<generated>) at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at sun.testProxy.CGLibProxy.intercept(TestProxy.java:136) ....
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
使用invokeSuper方法,而不是invoke方法。
...@OverridepublicObjectintercept(Objectarg0,Methodarg1,Object[]arg2,MethodProxyarg3)throwsThrowable{before();//Objectresult=arg3.invoke(arg0,arg2);Objectresult=arg3.invokeSuper(arg0,arg2);after();returnresult;}... 给我最佳答案吧!哈哈!哎,还真是,看走眼了,多谢指点哦 把你的 CGLibProxy类 getProxy()方法更改为下面的内容试试 Enhancerenhancer=newEnhancer();//设置父类enhancer.setSuperclass(cls);//设置需要织入的逻辑enhancer.setCallback(this);return(T)enhancer.create();试了下,问题不在这儿,我是照着 @黄勇的博客《Proxy那些事儿》敲的,方法写错了,马虎大意了