JAVA基础_动态代理的基本API

  • JDK动态代理

    • 代理类中使用的方法需要声明在接口中
    • 需要得到目标类的对象
  • Cglib包中的动态代理
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理
 *
 * @author zmh
 */
public class DynamicProxyTest {

    /**
     * JDK自带动态代理
     */
    @Test
    public void test01() {
        UserService userService = new UserServiceImpl();
        InvocationHandler invocationHandler = new MyInvocationHandler(userService);
        UserService userServiceProxy = (UserService) Proxy.newProxyInstance(
                userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), invocationHandler);
        System.out.println(userServiceProxy.method01(1));
        System.out.println(userServiceProxy.method02(2));
//        System.out.println(userServiceProxy.method03(2));
    }

    /**
     * Cglib动态代理
     */
    @Test
    public void test02() {
        CglibProxy cglibProxy = new CglibProxy();
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserServiceImpl.class);
        enhancer.setCallback(cglibProxy);
        UserService userService = (UserService) enhancer.create();
        userService.method01(1);
        userService.method02(2);
    }

}

/**
 * Cglib动态代理
 */
class CglibProxy implements MethodInterceptor {

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("++++++before " + methodProxy.getSuperName() + "++++++");
        System.out.println(method.getName());
        Object result = methodProxy.invokeSuper(obj, args);
        System.out.println("++++++before " + methodProxy.getSuperName() + "++++++");
        return result;
    }
}

/**
 * JDK动态代理
 */
class MyInvocationHandler implements InvocationHandler {
    private Object target;

    MyInvocationHandler() {
        super();
    }

    MyInvocationHandler(Object target) {
        super();
        this.target = target;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] args) throws Throwable {
        if ("getName".equals(method.getName())) {
            System.out.println("++++++before " + method.getName() + "++++++");
            Object result = method.invoke(target, args);
            System.out.println("++++++after " + method.getName() + "++++++");
            return result;
        } else {
            Object result = method.invoke(target, args);
            return result;
        }
    }

}

/**
 * 接口
 */
interface UserService {
    String method01(int id);

    Integer method02(int id);
}

interface AdminService {
    String method03(int id);

    Integer method04(int id);
}

/**
 * 实现类
 */
class UserServiceImpl implements UserService, AdminService {

    @Override
    public String method01(int id) {
        System.out.println("------method01------");
        return "method01-" + id;

    }

    @Override
    public Integer method02(int id) {
        System.out.println("------method02------");
        return id;
    }

    @Override
    public String method03(int id) {
        System.out.println("------method03------");
        return "method03-" + id;
    }

    @Override
    public Integer method04(int id) {
        System.out.println("------method04------");
        return id;
    }
}

原文地址:https://www.cnblogs.com/houhou87/p/10122185.html

时间: 2024-10-09 21:56:31

JAVA基础_动态代理的基本API的相关文章

Java基础:动态代理在RPC框架中应用

转载请注明出处:jiq?钦's technical Blog RPC,远端过程调用.就是调用远端机器上的方法. 原理其实很简单,就是客户端上运行的程序在调用对象方法时,底层将针对该方法的调用转换为TCP/HTTP请求,发送到远端服务器,远端服务器监听固定端口,收到这个TCP/HTTP请求后会解析出相关信息,包括客户端想要调用哪个类的哪个方法,参数是什么等,然后进行对应的调用,将调用结果再通过数据包发回即可. RPC中一般会有一些"契约"的概念,即客户端和服务端双方约定好的接口,表明服务

Java基础加强——动态代理

代理模式: 为其他对象提供一种代理以控制对这个对象的访问. 代理模式主要分为两类: 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了.  动态代理:在程序运行时,运用反射机制动态创建而成 1.静态代理相对好理解一些,来看下面的代码: 接口 Count.java /** * 账户接口 * @author jiangbei01 * */ public interface Count { void add(); void update();

重学JAVA基础(三):动态代理

1.接口 public interface Hello { public void sayHello(); } 2.实例类 public class Hello2 { public void sayHello() { System.out.println("hello world2!"); } } public class Hello3 extends Hello2{ } public class HelloImpl implements Hello{ @Override public

mybatis基础_动态代理开发

1.使用原始dao开发需要编写mapper的接口和实现类 1.编写接口 public interface UserDao { User getUserById(int userId); } 2.编写实现类 public class UserDaoImpl implements UserDao { private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory)

[Java]Spring AOP基础知识-动态代理

Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的动态代理:另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. 带有横切逻辑的实例 我们通过具体化代码实现上一节所介绍例子的性能监视横切逻辑,并通过动态代理技术对此进行改造.在调用每一个目标类方法时启动方法的性能监视,在目标类方法调

Spring之AOP原理_动态代理

面向方面编程(Aspect Oriented Programming,简称AOP)是一种声明式编程(Declarative Programming).声明式编程是和命令式编程(Imperative Programming)相对的概念.我们平时使用的编程语言,比如C++.Java.Ruby.Python等,都属命令式编程.命令式编程的意思是,程序员需要一步步写清楚程序需要如何做什么(How to do What).声明式编程的意思是,程序员不需要一步步告诉程序如何做,只需要告诉程序在哪些地方做什么

java反射与动态代理

Java反射与动态代理 Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制.java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性.这些都是java的基础知识,要想成为一名合格的程序猿,必须掌握! Java反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为

使用Java中的动态代理实现数据库连接池

2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈.我们可以在 互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度.很多的连接池 都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前

浅谈-Java设计模式之动态代理

动态代理模式(Dynamic Proxy Pattern): 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的. 首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的: InvocationHandler该接口唯一方法 invoke(Object proxy, Method method, Object[] args) Object