Java中如何实现代理机制(JDK、CGLIB)

代理分为两种:

1.静态代理

2.动态代理

 动态代理又分为两种:jdk 实现  ;Cglib 实现

3.Java中如何实现代理机制(JDK、CGLIB)

JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口。
CGLIB动态代理:代理类是目标类的子类,用到MethodInterceptor接口。

注意:

使用版本:

首先介绍jdk 实现动态代理:

第一步:建立接口

package com.asiainfo.proxydemo;

public interface BookFacade {
     public void addBook(); 
}
第二步:实现接口

package com.asiainfo.proxydemo;

import java.io.Serializable;

public class BookFacadeImpl implements BookFacade, Serializable {
    
    public void addBook() {
        // TODO Auto-generated method stub
          System.out.println("增加图书方法。。。");  
    }

}
第三步:建立代理类

    package com.asiainfo.proxydemo;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class BookFacadeProxy implements InvocationHandler {
        
        private Object target;    
        
        public Object bind(Object target){
            this.target=target;
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), (Class<?>[])                                                                           target.getClass().getGenericInterfaces(), this);
        }
    
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // TODO Auto-generated method stub
            Object result=null;
            System.out.println("事物开始执行");
            method.invoke(target, args);
            System.out.println("事情结束");
            return null;
        }
        //代码测试
        public static void main(String[] args) {
            BookFacade target = new BookFacadeImpl();
            BookFacade bookFacadeProxy = (BookFacade) new BookFacadeProxy().bind(target);
            bookFacadeProxy.addBook();
            
         
        }
    
    }
其次是Cglib 实现:

第一步:

package com.asiainfo.proxydemo;

public class BookFacadeCglib {
     public void addBook(){
         System.out.println("addBook");
     }
}
第二步:cglib 建立测试类

package com.asiainfo.proxydemo;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class BookFacadeProxyCglib implements MethodInterceptor {
    private Object target;
    
    public Object getInstance(Object target){
        this.target=target;
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        //回调方法
        //enhancer.setCallbackType(this.target.getClass());
        enhancer.setCallback(this);
        //创建代理对象
        return enhancer.create();
    }

    public   Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        // TODO Auto-generated method stub
        System.out.println("before run");
        Object returnvalue=proxy.invokeSuper(obj, args);
        System.out.println("after run");
        return null;
    }

   //cglib代码测试 
    public static void main(String[] args) {
         BookFacadeCglib target = new BookFacadeCglib();
         BookFacadeCglib bookFacadeCglib = (BookFacadeCglib) new BookFacadeProxyCglib().getInstance(target);
         bookFacadeCglib.addBook();

    }

}
参考:http://lrd.ele.me/2017/01/09/dynamic_proxy/

       :https://blog.csdn.net/einstein10147/article/details/77040110

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java面试题43要使某个类能被同一个包中的其他类访问,但不能被这个包以外的类访问,可以( )

java面试题43要使某个类能被同一个包中的其他类访问&#xff0c;但不能被这个包以外的类访问&#xff0c;可以( ) A让该类不使用任何关键字 B使用private关键字 C 使用protected关键字 D 使用void关键字 答案为A 我是歌谣&#xff0c;如果有什么不合理之处指出。我是歌谣&…

app.config数据库路径问题

最近做一个小东西&#xff0c;用到了subsonic&#xff0c;因为用的是sqlite&#xff0c;数据库的路径问题又被提了上来。在connectionStrings里面只能指定绝对路径。对于sqlite,access这样的数据库来说&#xff0c;却需要使用到相对路径&#xff0c;否则发布后就会出问题。自己…

java面试题44关于 Socket 通信编程,以下描述正确的是:( )

java面试题44关于 Socket 通信编程&#xff0c;以下描述正确的是&#xff1a;&#xff08; &#xff09; A 客户端通过new ServerSocket()创建TCP连接对象 B 客户端通过TCP连接对象调用accept()方法创建通信的Socket对象 C 客户端通过new Socket()方法创建通信的Socket对象 …

Java弱引用(WeakReference)的理解与使用

转:https://blog.csdn.net/zmx729618/article/details/54093532 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和j…

在VB应用程序中调用Excel2000

Visual Basic简称(VB)是设计Windows应用程序强有力的开发工具&#xff0c;“全球绝大多数Windows应用程序都是用VB开发的”&#xff1b; Excel是目前使用最广泛的办公应用软件之一&#xff0c;它具有强大的数学分析与计算功能&#xff0c;包括很多VB没有的求值数学表达式的函数…

shiro学习(7):shiro连接数据库 方式二

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 我们先看一下目录结构 首先 jar包引入 pom.xml文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0&quo…

java中的4种reference的差别和使用场景(含理论、代码和执行结果)

转:https://blog.csdn.net/aitangyong/article/details/39453365 我们知道java语言提供了4种引用类型&#xff1a;强引用、软引用(SoftReference)、弱引用&#xff08;WeakReference&#xff09;和幽灵引用&#xff08;PhantomReference&#xff09;&#xff0c;与引用密切相关…

【vue开发】 父组件传值给子组件时 ,watch props 监听不到解决方案

解决方案&#xff1a; watch:{  data:{ immediate:true,handler:function(){ } }} 示例&#xff1a; 转载于:https://www.cnblogs.com/xiaohuizhang/p/11393444.html

shiro学习(8):shiro连接数据库 三

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 我们先看一下目录结构 首先 log4j.properties ### \u914D\u7F6E\u6839 ### log4j.rootLogger error,console ,fileAppender,dailyRollingFile,ROLLING_FILE,MAIL,DATABASE### \u8BBE\u7…

Java 中的 Reference

1、强引用&#xff08;StrongReference&#xff09; 强引用不会被GC回收&#xff0c;并且在java.lang.ref里也没有实际的对应类型。举个例子来说&#xff1a;     Object obj new Object();     这里的obj引用便是一个强引用&#xff0c;不会被GC回收。 2、软引用&…

[转贴]暴雪的霸王条款是否合理?

暴雪的霸王条款是否合理&#xff1f; 类似于这样的霸王条款很多&#xff0c;但暴雪是个典型&#xff0c;谁让暴雪树大招风呢&#xff1f;暴雪蛮横地宣布游戏中的所有数据归暴雪所有&#xff0c;那么自然也包括玩家辛辛苦苦所得来的虚拟财产&#xff0c;暴雪这样做无疑是出于以下…

Java 中常用缓存Cache机制的实现

转&#xff1a;https://www.cnblogs.com/JAYIT/p/5647924.html 所谓缓存&#xff0c;就是将程序或系统经常要调用的对象存在内存中&#xff0c;一遍其使用时可以快速调用&#xff0c;不必再去创建新的重复的实例。这样做可以减少系统开销&#xff0c;提高系统效率。 所谓缓存&…

巧用小程序·云开发实现邮件发送功能丨实战

先看效果图&#xff1a; 通过上面的日志&#xff0c;可以看出我们是158开头的邮箱给250开头的邮箱发送邮件&#xff0c;下面是成功接收到的邮件。 准备工作 1、qq邮箱一个2、开通你的qq邮箱的授权码&#xff08;会具体讲解&#xff09;3、注册自己的小程序&#xff08;因为只有…

shiro学习(10):servelet实现权限认证一

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 在pom.xml里面添加 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.2.3</version></dep…

JAVA多线程及线程状态转换

转发:https://www.cnblogs.com/nwnu-daizh/p/8036156.html 以下内容整理自&#xff1a;http://blog.csdn.net/wtyvhreal/article/details/44176369 线程&#xff1a;是指进程中的一个执行流程。 线程与进程的区别&#xff1a;每个进程都需要操作系统为其分配独立的内存地址空…

shiro学习(11):servelet实现权限认证二

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 在pom.xml里面添加 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.2.3</version></dep…

[MOSS开发]:如何使用用户控件

如果是纯手工开发web part&#xff0c;其实还是比较困难的&#xff0c;因为这种类型的web part是以类库的形式出现&#xff0c;没有可视化的界面&#xff0c;完全由代码写出来&#xff0c;包含控件的样式&#xff0c;属性&#xff0c;事件等等。开发过自定义控件的朋友可能会感…

shiro学习(12)No WebApplicationContext found:

java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener or DispatcherServlet registered?org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:252) 解决 web.xml缺少了Spring监听器&#x…

Java 的Runnable和Callable的区别

Runnable和Callable的区别是&#xff0c;(1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值&#xff0c;而Runnable的任务是不能返回值得(3)call方法可以抛出异常&#xff0c;run方法不可以(4)运行Callable任务可以拿到一个Future对象…

Spring Boot----整合SpringCloud

首先比较一下Zookeeper和Eureka的区别&#xff1f; 1、CAP&#xff1a;C&#xff1a;强一致性&#xff0c;A&#xff1a;高可用性&#xff0c;P&#xff1a;分区容错性(分布式中必须有) CAP理论的核心是&#xff1a;一个分布式系统不可能同时很好的满足一致性&#xff0c;可用性…