jdk代理

接口:
public interface IUserService {

    public void saveUser(String username,String password);
    public void updateUser(String username,String password);
    public void deleteUser(String username);
    public String findUser();
}
目标对象:
public class UserServiceImpl implements IUserService {

    @Override
    public void saveUser(String username, String password) {
        System.out.println("保存用户【"+username+"】,密码是【"+password+"】");
    }

    @Override
    public void updateUser(String username, String password) {
        System.out.println("更新用户【"+username+"】,密码是【"+password+"】");
    }

    @Override
    public void deleteUser(String username) {
        System.out.println("删除用户【"+username+"】");
    }

    @Override
    public String findUser() {
        System.out.println("查询用户,返回王老五");
        return "王老五";
    }

}
代理对象:
public class JdkDaili implements InvocationHandler{
    Object userServiceImpl;
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        // TODO Auto-generated method stub
        System.out.println(proxy.getClass());
        System.out.println(method.getName());
        if (args.length>0&&args!=null) {
            for (Object object : args) {
                System.out.println(object);
            }
        }

        return method.invoke(userServiceImpl, args);
    }

    public Object createrDaiLi(Object userServiceImpl) {
        this.userServiceImpl=userServiceImpl;
        return Proxy.newProxyInstance(this.userServiceImpl.getClass().getClassLoader(), this.userServiceImpl.getClass().getInterfaces(), this );
    }

}

测试:
public static void main(String[] args) {

        //需求:在访问保存和更新的方法之前,先让你执行一个校验,使用代理对象完成

        JdkDaili jdkDaili=new JdkDaili();//用目标对象创建代理对象
        IUserService iService=(IUserService) jdkDaili.createrDaiLi(new UserServiceImpl());//代理对象执行 代理类里面的invoke()方法,返回return method.invoke(目标对象, 目标对象的方法的参数);
        iService.saveUser("hgiohr", "51684");
    }
时间: 2024-07-30 13:51:04

jdk代理的相关文章

性能优于JDK代理,CGLib如何实现动态代理

按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行时,运用反射机制动态创建而成. 动态代理三种方式 动态代理实现有三种方式,jdk动态代理(基于接口),cglib动态代理(基于继承),javassist(hibernate中使用这种方式)实现动态代理. JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢? 这就需要CGLib了. cgl

动态代理 (JDK代理)

1.动态代理用到的类和方法 动态代理涉及到的类是java.lang.reflect.Proxy,主要是用到它的newProxyInstance方法. public class Proxy implements java.io.Serializable {     /** prefix for all proxy class names */     private final static String proxyClassNamePrefix = "$Proxy";    /**  

jdk代理(只能代理实现了接口的类)

被代理对象实现了某些接口,在运行时产生class(代理)类,使用动态代理实现InvocationHandler接口 1.创建一个实现InvocationHandler的类,它必须实现invoke(proxy:被代理对象,method:被代理方法,args:方法的参数)方法,定义一个Object对象,写一个有参构造器传入.调用method.invoke(target)方法 2.创建被代理的类以及接口,含有业务逻辑方法 3.调用Proxy的静态方法,创建一个代理类Proxy.newProxyInst

JDK动态代理

一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A proxy is an agent or substitute authorized to act for another person or a document which authorizes the agent so to act. 意思是说:代理指的是一个代理人(或替代品),它被授权代表

java动态代理(JDK和cglib)

转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,

Spring AOP详解 、 JDK动态代理、CGLib动态代理

AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就成为“连接点”,Spring仅支持方法的连接点,即

《转》java动态代理(JDK和cglib)

该文章转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建

JDK动态代理和Cglib的动态代理

最简单的是静态代理方法,即代理模式,这里就不多啰嗦了.. 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需要被代理的类需要有接口,否则无法实现 package proxy.dynamic; public interface IBook { void add(); } 实现接口的类如下 package proxy.dynamic; public class Book implements IBook { @Override public void add() { System.

重温Spring之旅5——AOP代理对象、JDK动态代理、使用cglib生产代理

AOP--代理对象 代理模式:代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题. 代理主题(Proxy)角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象: