Java代理示例:静态代理、jdk动态代理、cglib动态代理

Bertha 。 2022-02-23 01:54 530阅读 0赞

1 接口及其实现

  1. public interface Greeting {
  2. void sayHello(String name);
  3. }
  4. ---------------------------------------------
  5. public class GreetingImpl implements Greeting {
  6. @Override
  7. public void sayHello(String name) {
  8. System.out.println( "Hello! " + name );
  9. }
  10. }

2 静态代理

  1. public class GreetingProxy implements Greeting {
  2. private GreetingImpl greeting;
  3. public GreetingProxy(GreetingImpl greeting){
  4. this.greeting = greeting;
  5. }
  6. @Override
  7. public void sayHello(String name) {
  8. before();
  9. greeting.sayHello(name);
  10. after();
  11. }
  12. private void before(){
  13. System.out.println("Before");
  14. }
  15. private void after(){
  16. System.out.println("After");
  17. }
  18. }

3 JDK动态代理

  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. // 1. 首先实现一个InvocationHandler,方法调用会被转发到该类的invoke()方法。
  5. public class JDKDynamicProxy implements InvocationHandler {
  6. // 目标对象
  7. private Object target;
  8. public JDKDynamicProxy(Object target){
  9. this.target = target;
  10. }
  11. // 2. 然后在需要使用Hello的时候,通过JDK动态代理获取Hello的代理对象。
  12. @SuppressWarnings("unchecked")
  13. public <T>T getProxy() {
  14. // 会返回一个实现了指定接口的代理对象,对该对象的所有方法调用都会转发给InvocationHandler.invoke()方法
  15. return (T) Proxy.newProxyInstance(
  16. target.getClass().getClassLoader(), // 指定代理对象的类加载器;
  17. target.getClass().getInterfaces(), // 代理对象需要实现的接口,可以同时指定多个接口
  18. this // 自定义的InvocationHandler,即方法调用的实际处理者,代理对象的方法调用都会转发到这里
  19. );
  20. }
  21. @Override
  22. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  23. before(); // 前置处理
  24. Object result = method.invoke(target,args);
  25. after(); // 后置处理
  26. return result;
  27. }
  28. private void before(){
  29. System.out.println("Before");
  30. }
  31. private void after(){
  32. System.out.println("After");
  33. }
  34. }

4 CGLIB动态代理

4.1 pom.xml

  1. <dependency>
  2. <groupId>cglib</groupId>
  3. <artifactId>cglib</artifactId>
  4. <version>2.2.2</version>
  5. </dependency>

4.2 Java实现

  1. import net.sf.cglib.proxy.Enhancer;
  2. import net.sf.cglib.proxy.MethodInterceptor;
  3. import net.sf.cglib.proxy.MethodProxy;
  4. import java.lang.reflect.Method;
  5. public class CGLibDynamicProxy implements MethodInterceptor {
  6. private static CGLibDynamicProxy instance = new CGLibDynamicProxy();
  7. private CGLibDynamicProxy(){
  8. }
  9. public static CGLibDynamicProxy getInstance(){
  10. return instance;
  11. }
  12. @SuppressWarnings("unchecked")
  13. public <T>T getProxy(Class<T> cls) {
  14. return (T) Enhancer.create(cls,this);
  15. }
  16. @Override
  17. public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
  18. before();
  19. Object result = proxy.invokeSuper(target,args);
  20. after();
  21. return result;
  22. }
  23. private void before(){
  24. System.out.println("Before");
  25. }
  26. private void after(){
  27. System.out.println("After");
  28. }
  29. }

5 测试代码

  1. public class MainProxy {
  2. public static void main(String[] args) {
  3. // staitcProxy();
  4. jdkDynamicProxy();
  5. // cglibDynamicProxy();
  6. }
  7. private static void staitcProxy(){
  8. Greeting greeting = new GreetingProxy(new GreetingImpl());
  9. greeting.sayHello("jtzen9");
  10. }
  11. private static void jdkDynamicProxy(){
  12. JDKDynamicProxy jdkDynamicProxy = new JDKDynamicProxy(new GreetingImpl());
  13. Greeting greeting = jdkDynamicProxy.getProxy();
  14. greeting.sayHello("jtzen9");
  15. }
  16. private static void cglibDynamicProxy(){
  17. Greeting greeting = CGLibDynamicProxy.getInstance().getProxy(GreetingImpl.class);
  18. greeting.sayHello("jtzen9");
  19. }
  20. }

发表评论

表情:
评论列表 (有 0 条评论,530人围观)

还没有评论,来说两句吧...

相关阅读