精华内容
下载资源
问答
  • 动态代理什么?应用场景?
    万次阅读
    2019-06-17 10:00:39

    动态代理是什么?应用场景?

    动态代理:在运行时,创建目标类,可以调用和扩展目标类的方法。

    Java 中实现动态的方式:JDK 中的动态代理 和 Java类库 CGLib

     

    应用场景如:

    • 统计每个 api 的请求耗时
    • 统一的日志输出
    • 校验被调用的 api 是否已经登录和权限鉴定
    • Spring的 AOP 功能模块就是采用动态代理的机制来实现切面编程

     

    详细可以参考我的专栏:Java 代理

     


    【Java面试题与答案】整理推荐

     

    更多相关内容
  • Socks代理什么意思?有什么用?

    千次阅读 2022-02-25 13:57:17
    什么是Socks代理 Socks代理:中文名全能代理,就像有很多跳线的转接板,它只是简单地将一端的系统连接到另外一端。支持多种协议,包括http、ftp请求及其它类型的请求。它分socks 4 和socks 5两种类型,socks 4只...

    什么是Socks代理

    Socks代理:中文名全能代理,就像有很多跳线的转接板,它只是简单地将一端的系统连接到另外一端。支持多种协议,包括http、ftp请求及其它类型的请求。它分socks 4 和socks 5两种类型,socks 4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份验证机制等协议。其标准端口为1080。


    Socks代理的原理

    socks代理相应的采用socks协议的代理服务器就是SOCKS服务器,是一种通用的代理服务器。Socks是个电路级的底层网关,是DavidKoblas在1990年开发的,此后就一直作为Internet RFC标准的开放标准。Socks不要求应用程序遵循特定的操作系统平台,Socks 代理与应用层代理、 HTTP 层代理不同,Socks代理只是简单地传递数据包,而不必关心是何种应用协议(比如FTP、HTTP和NNTP请求)。所以,Socks代理比其他应用层代理要快得多。它通常绑定在代理服务器的1080端口上。如果在企业网或校园网上,需要透过防火墙或通过代理服务器访问Internet就可能需要使用SOCKS。一般情况下,对于拨号上网用户都不需要使用它。注意,浏览网页时常用的代理服务器通常是专门的http代理,它和SOCKS是不同的。因此,浏览网页不等于通过SOCKS访问Internet。 常用的防火墙,或代理软件都支持SOCKS,但需要其管理员打开这一功能。如果不确信是否需要SOCKS或是否有SOCKS可用,请与网络管理员联系。为了使用socks,需要了解一下内容:

    ① SOCKS服务器的IP地址

    ② SOCKS服务所在的端口

    ③ 这个SOCKS服务是否需要用户认证?如果需要,要向网络管理员申请一个用户和口令

    知道了上述信息,就可以把这些信息填入“网络配置”中,或者在第一次登记时填入,就可以使用socks代理了。ssl证书申请可以在蔚可云申请。

    实际应用

    在实际应用中SOCKS代理可以用作为:电子邮件、新闻组软件、网络传呼ICQ、网络聊天MIRC和使用代理服务器打游戏等等各种应用软件当中。

    展开全文
  • 典型回答 反射机制是Java语言提供的一种基础功能,赋予...动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的。比如用来包装RPC调用、面向切面的编程(AOP)。...

    典型回答

    反射机制是Java语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或构造对象,甚至可以运行时修改类定义。

    动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的。比如用来包装RPC调用、面向切面的编程(AOP)。

    实现动态代理的方式很多,比如JDK自身提供的动态代理,就是主要利用了反射机制。还有其他的实现方式,比如利用传说中更高性能的字节码操作机制,类似ASM、cglib(基于ASM)、Javassist等。

    知识扩展

    1、反射机制及其演进

    对于Java语言的反射机制本身,如果你去看一下java.lang或java.lang.reflect包下的相关抽象,就会有一个很直观的印象了。Class、Field、Method、Constructor等,这些完全就是我们去操作类和对象的元数据对应。反射的各种典型用例有太多的文章进行过详细的介绍,这里就不再赘述。

    关于反射,有一点需要特意提一下,就是反射提供的AccessibleObject.setAccessible(boolean flag)。它的子类也大都重写了这个方法,这里的所有accessible可以理解成修饰成员的public、protected、private,这意味着我们可以在运行时修改成员访问限制!

    setAccessible的应用场景非常普遍,遍布我们的日常开发、测试、依赖注入等各种框架中。比如,在O/R Mapping框架中,我们为一个Java实体对象,运行时自动生成setter、getter的逻辑,这对于加载或者持久化数据是非常必要的,框架通常可以利用反射做这个事情,而不需要开发者手动写类似的重复代码。

    另一个典型场景就是绕过API访问控制。我们日常开发时可能被迫要调用内部API去做些事情,比如,自定义的高性能NIO框架需要显式地释放DirectBuffer,使用反射绕开限制是一种常见办法。

    但是,在Java 9以后,这个方法的使用可能会存在一些争议,因为Jigsaw项目新增的模块化系统,出于强封装性的考虑,对反射访问进行了限制。Jigsaw引入了所谓Open的概念,只有当被反射操作的模块和指定的包对反射调用者模块Open,才能使用setAccessible;否则,被认为是不合法操作。

    因为反射机制使用广泛,根据社区讨论,目前Java 9仍然保留了兼容Java 8的行为,但是很有可能在未来版本,完全启用这里提到的针对setAccessible的限制。

    2、动态代理

    一起看看,动态代理到底是解决什么问题?

    首先,它是一个代理机制。如果熟悉设计模式中的代理模式,我们会知道,代理可以看做是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成。

    通过代理可以让调用者与实现者之间解耦。比如进行RPC调用,框架内部的寻址、序列化、反系列化等,对于调用者往往是没有太大意义的,通过代理,可以提供更加友善的界面。

    代理的发展经历了静态到动态的过程,源于静态代理引入的额外工作。类似早期的RMI之类古董技术,还需要rmic之类工具生成静态stub等各种文件,增加了很多繁琐的准备工作,而这又和我们的业务逻辑没有关系。利用动态代理机制,相应的stub等类,可以在运行时生成,对应的调用操作也是动态完成,极大地提高了我们的生产力。改进后的RMI已经不再需要手动去准备这些了,虽然它仍然是相对古老落后的技术,未来也许会逐步被移除。

    这么说可能不够直观,我们可以看JDK动态代理的一个简单例子。下面指示加了一句print,在生产系统中,我们可以轻松扩展类似逻辑进行诊断、限流等。

    public class MyDynamicProxy {
    
      public static void main(String[] args) {
        HelloImpl hello = new HelloImpl();
        MyInvocationHandler handler = new MyInvocationHandler(hello);
        // 构造代码实例
        Hello proxyHello = (Hello) Proxy.newProxyInstance(
            HelloImpl.class.getClassLoader(),
            HelloImpl.class.getInterfaces(),
            handler);
        // 调用代理方法
        proxyHello.sayHello();
      }
    
      static interface Hello {
        void sayHello();
      }
    
      static class HelloImpl implements Hello {
        @Override
        public void sayHello() {
          System.out.println("Hello World");
        }
      }
    
      static class MyInvocationHandler implements InvocationHandler {
        private Object target;
    
        public MyInvocationHandler(Object target) {
          this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          System.out.println("Invoking sayHello");
          Object result = method.invoke(target, args);
          return result;
        }
      }
    }
    

    上面的JDK Proxy例子,非常简单地实现了动态代理的构建和代理操作。首先,实现对应的InvocationHandler;然后,以接口Hello为纽带,为被调用目标构建代理对象,进而应用程序就可以使用代理对象间接运行调用目标的逻辑,代理为应用插入额外逻辑(这里是println)提供了便利的入口。

    从API设计和实现的角度,这种实现仍然有局限性,因为它是以接口为中心的,相当于添加了一种对于被调用者没有太大意义的限制。我们实例化的是Proxy对象,而不是真正的被调用类型,这在实践中还是可能带来各种不便和能力退化。

    如果被调用者没有实现接口,而我们还是希望利用动态代理机制,那么可以考虑其它方式。我们知道Spring AOP支持两种模式的动态代理,JDK Proxy或者cglib,如果我们选择cglib方式,你会发现对接口的依赖被克服了。

    cglib动态代理采取的是创建目标类型的子类的方式,因为是子类话,我们可以达到近似使用被调用者本身的效果。

    那我们在开发中怎样选择呢?简单对比两种方式各自优势。

    JDK Proxy的优势:

    • 最小化依赖关系,减少依赖意味着简化开发和维护,JDK本身的支持,可能比cglib更加可靠。
    • 平滑进行JDK版本升级,而字节码类库通常需要进行更新以保证在新版Java上能够使用。
    • 代码实现简单。

    基于类似cglib框架的优势:

    • 有的时候调用目标可能不便实现额外接口,从某种角度看,限定调用者实现接口是有些侵入性的时间,类似cglib动态代理就没有这种限制。
    • 只操作我们关心的类,而不必为其它相关类增加工作量。
    • 高性能。

    【完】

    展开全文
  • 代理机制

    万次阅读 2020-05-15 18:52:48
    静态代理和动态代理 Java动态代理的优势是实现无侵入式的代码扩展,也就是方法的增强;让你可以在不用修改源码的情况下,增强一些方法;在方法的前后你可以做你任何想做的事情(甚至不去执行这个方法就可以)。 1....

    静态代理和动态代理

    Java动态代理的优势是实现无侵入式的代码扩展,也就是方法的增强;让你可以在不用修改源码的情况下,增强一些方法;在方法的前后你可以做你任何想做的事情(甚至不去执行这个方法就可以)。

    1.动态代理是设计模式中的代理模式:

    定义:为其它对象提供一种代理以控制对这个对象的访问控制;在某些情况下,客户不想或者不能直接引用另一个对象,这时候代理对象可以在客户端和目标对象之间起到中介的作用。

    2.静态代理

    静态代理类:由程序员创建或者由第三方工具生成,再进行编译;在程序运行之前,代理类的.class文件已经存在了。
    静态代理类通常只代理一个类。
    静态代理事先知道要代理的是什么。

    3.动态代理

    动态代理类:在程序运行时,通过反射机制动态生成。
    动态代理类通常代理接口下的所有类。
    动态代理事先不知道要代理的是什么,只有在运行的时候才能确定。
    动态代理的调用处理程序必须事先InvocationHandler接口,及使用Proxy类中的newProxyInstance方法动态的创建代理类。
    Java动态代理只能代理接口,要代理类需要使用第三方的CLIGB等类库。

    简述

    利用代理可以在运行时创建一个实现了 一组给定接口的新类。这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用。
    

    为何使用代理

    框架的编写者无法知道使用者会编写怎样的类怎样的方法,所以无法用new的方法来创建对象,也无法用对象.方法的方式来直接调用对应的方法,所以需要用反射的机制按照class.forName()这个方式获取类的信息然后在newInstance()进行实例化,拿到类的信息之后用代理机制的invoke来执行类的方法,所以说反射机制和代理机制是相辅相成的,反射来拿到信息,代理来执行方法,实现功能。

    何时使用代理

    假设有一个表示接口的Class对象(有可能只包含-一个接口),它的确切类型在编译时无
    法知道。要想构造一个实现这些接口的类,就需要使用newInstance方法
    或反射找出这个类的构造器。但是,不能实例化一个接口,需要在程序处于运行状态时定义
    一个新类。
    为了解决这个问题,有些程序将会生成代码;将这些代码放置在一-个文件中; 调用编译
    器;然后再加载结果类文件。很自然,这样做的速度会比较慢,并且需要将编译器与程序放
    在一起。而代理机制则是一种更好的解决方案。代理类可以在运行时创建全新的类。这样的
    代理类能够实现指定的接口。尤其是,它具有下列方法:
    ●指定接口所需要的全部方法。
    ●Object类中的全部方法,例如,toString、 equals 等。
    然而,不能在运行时定义这些方法的新代码。而是要提供-一个调用处理器(invocation
    handler)。调用处理器是实现了InvocationHandler 接口的类对象。在这个接口中只有-一个方法:
    0bject invoke(Object proxy, Method method, 0bject[] args)
    无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,并向其传递
    Method对象和原始的调用参数。调用处理器必须给出处理调用的方式。

    创建代理对象

    要想创建一个代理对象,需要使用Proxy类的newProxyInstance方法。这个方法有三个
    参数:
    ●一个类加载器( class loader)。作为Java安全模型的一部分, 对于系统类和从因特网
    上下载下来的类,可以使用不同的类加载器。有关类加载器的详细内容将在卷II第9
    章中讨论。目前,用null表示使用默认的类加载器。
    ●一个Class对象数组,每个元素都是需要实现的接口。
    ●一个调用处理器。
    还有两个需要解决的问题。如何定义–个处理器?能够用结果代理对象做些什么?当.
    然,这两个问题的答案取决于打算使用代理机制解决什么问题。使用代理可能出于很多原
    因,例如:
    ●路由对远程服务器的方法调用。
    ●在程序运行期间,将用户接口事件与动作关联起来。
    ●为调试,跟踪方法调用。
    在示例程序中,使用代理和调用处理器跟踪方法调用,并且定义了一个TraceHander包
    装器类存储包装的对象。其中的invoke 方法打印出被调用方法的名字和参数,随后用包装好的对象作为隐式参数调用这个方法。

    代码示例

    Singer类:

    public interface Singer {
        void sing();
        void dance();
    }
    
    
    

    AW类:

    public class AW implements Singer{
        String name;
    
        public AW(String name) {
            this.name = name;
        }
    
        @java.lang.Override
        public void sing() {
            System.out.println("我正在唱歌");
        }
    
        @java.lang.Override
        public void dance() {
            System.out.println("我正在跳舞");
        }
    
    }
    
    

    Test类:

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class Test {
        public static void main(String[] args) {
    
            Singer singer = new AW("张三");
    		//创建代理对象,第一个参数是类加载器,第二个参数是类实现的接口,第三个new一个InvocationHandler 接口的实现类的对象把被代理对象传进去
            Object o = Proxy.newProxyInstance(singer.getClass().getClassLoader(), singer.getClass().getInterfaces(),
                    new SingerHandler(singer));
            if (o instanceof Singer) {
                Singer s = (Singer) o;
                s.sing();//
                s.dance();//
            }
        }
    }
    class SingerHandler implements InvocationHandler {
        private Singer singer;
    
        public SingerHandler(Singer singer) {
            this.singer = singer;
        }
    	//每次调用方法的时候会调用invoke方法来代理
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("给点钱");
            //method是把被代理类的方法当做Method的对象传了进来,下一行是调用被代理对象的方法的意思
            return method.invoke(singer, args);
        }
    }
    
    展开全文
  • iOS代理机制实现原理和应用

    千次阅读 2017-11-29 14:47:34
    iOS代理机制实现原理 代理(Delegate)是iOS开发中的一种重要的消息传递方式,是iOS开发中普遍使用的通用设计模式,iOS集成开发环境Xcode中,提供大量的控件,例如UITableView,UIScrollViewDelegate ,...
  • 时隔多年,重新拿起 Burp Suite。对以前使用 Burp 还有一些印象,但是具体操作起来,还是有一些出入。折腾了一阵子,终于在手机端和 PC 端都代理成功了。...代理机制不分什么端的设备,都是一样的。简单地讲就是,...
  • 浏览器缓存是什么?它的机制又是什么

    千次阅读 多人点赞 2018-11-16 17:45:28
    对于浏览器缓存,相信很多...什么是浏览器缓存: 简单来说,浏览器缓存就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中。缓存会根据进来的请求保存输出内容的副本。当下...
  • dubbo spi 机制ExtensionLoader源码分析
  • 反射机制介绍 JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java ...
  • 代理什么 代理模式,就是为其他的对象提供一种代理,以控制对这个对象的访问。Proxy代理对象与被代理对象对于调用方来说,完全一致,并且Proxy代理对调用方隐藏了被代理对象的实现细节。流程如下: 为什么要...
  • 代理模式——保护代理(三)

    千次阅读 2019-03-25 18:39:35
    Java在java.lang.reflect包中有自己的代理支持,利用这个包我们可以在运行时动态地创建一个代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类(继承了InvocationHandler的处理器类),因为实际的代理类...
  • 一分钟了解什么是代理ip和api接口

    千次阅读 2020-07-23 15:46:00
    代理ip 其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。代理服务器就好象一个大的Cache,这样就能显著提高浏览速度和效率。更重要的是:它是Internet链路级网关所提供的一种重要的安全功能...
  • 最常用的代理莫过于HTTP代理与Socks代理,那么什么是Socks代理呢?这里就简单介绍下。 其百科定义如下:Socks代理是基于Socks协议的一种代理,也叫全能代理,就像有很多跳线的转接板,它只是简单地将一端的系统...
  • JAVA反射机制与动态代理

    千次阅读 2015-03-09 16:54:52
    这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。 Java 反射机制主要提供了以下功能 1、在运行时判断任意一个对象所属的类。 2、在运行时构造任意一个类的对象。 3、在...
  • 动态代理和静态代理到底有什么区别,好处在哪里?
  • java反射机制到底是什么

    千次阅读 2014-04-10 20:37:48
    1.什么是反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为...
  • 前端配置跨域代理

    千次阅读 2020-11-24 16:30:00
    cors 是一种机制,该机制是使用 HTTP 头来告诉浏览器,允许运行在一个源上的 web 应用访问不同源上的资源。 除了 cors 的方案外,还可以通过配置代理来解决跨域问题,即把服务器的域名代理成本地进行请求,那么请求...
  • 什么要使用代理模式?

    千次阅读 2017-06-05 22:32:33
    Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,Proxy是代理意思,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理. 设计模式中...
  • 区块链是什么意思

    千次阅读 2018-05-31 10:52:02
    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。 区块链(Blockchain)是比特币的一个重要概念,...
  • Java底层机制

    千次阅读 多人点赞 2017-09-26 10:28:08
    JVM是一种解释执行class文件的规范技术。 本文知识点包括:JVM体系结构、编译和运行过程、类加载机制、类加载过程、Java垃圾回收机制等等。
  • 基于host的http代理--hproxy

    千次阅读 2019-08-29 22:35:51
    说到代理,大多数情况我们都会想到通过浏览器设置的正向代理,以及类似nginx的反向代理;而实际上除此之外还有一种基于host方式实现的代理。 本文主要讲述,如何实现一个基于host方式的http代理,以及它与普通代理...
  • Proxy(代理)

    千次阅读 2021-09-11 13:03:09
    Proxy用于修改某些操作的默认行为,也可以理解为在目标对象之前架设—层拦截,外部所有的访问都必须先通过这层拦截, 因此提供了—种机制,可以对外部的访问进行过滤和修改。这个词意为代理,在这里可以表示由它来”...
  • 轻松学,Java 中的代理模式及动态代理

    万次阅读 多人点赞 2017-06-29 22:08:55
    前几天我写了《秒懂,Java 注解 (Annotation)你可以这样学》,因为注解其实算反射技术中的一部分,然后我想了一下,反射技术中还有个常见的概念就是动态代理,于是索性再写一篇关于动态代理的博文好了。...
  • 正向代理与反向代理通俗版解释

    千次阅读 2017-12-03 15:34:48
    一 前言在互联网中经常遇到代理和反向代理的概念,有些初学者可能搞不清楚这两者直接的区别。本文尝试从实践场景、详细区别两个方面来阐述这两个概念。二 实践场景正向代理的场景:我们想访问国外某网站G(名字你...
  • 常见的反爬机制

    千次阅读 2020-04-28 15:17:15
    常见的基础反爬 1、Headers反爬虫 :Cookie、Referer、User-Agent 解决方案: 通过F12获取headers,传给requests.get()方法 ... 1、构造自己IP代理池,每次访问随机选择代理,经常更新代理池 2、购买开...
  • 有哪些反爬机制

    2020-07-16 14:25:35
    对于爬虫用户来说,网站的反爬机制可以说是他们的头号敌人。反爬机制是为了防止爬虫爬取数据过于频繁,给服务器造成过重的负担导致服务器崩溃而设置的机制,它其实也有几种不同的方式,下面我们就来说说。 1、通过...
  • 代理服务器基本知识

    万次阅读 多人点赞 2018-01-12 17:21:21
    一、什么是代理服务器? 代理服务器英文全称是 Proxy Server,其功能就是代理网络用户去取得网络信息。 形象的说:它是网络信息的中转站。 在一般情况下,我们使用网络浏览器直接去连接其他 Internet 站点取得...
  • 现在许多大型web网站都用到反向代理。除了可以防止外网对内网服务器的恶性攻击、缓存以减少服务器的压力和访问安全控制之外,还可以进行负载均衡,将用户请求分配给多个服务器。 反向代理服务器Nginx Nginx作为...
  • FactoryBean在Spring中算是一个比较有意思的存在了,虽然在日常的业务开发中,基本上不怎么会用到,但在某些场景下,如果用得好,却可以实现很多有意思的东西 本篇博文主要介绍如何通过...JDK动态代理 I...
  • SLA的定义来源百度,这到底是什么意思呢? 我们平常经常看到互联网公司喊口号,我们今年一定要做到3个9、4个9,即99.9%、99.99%,甚至还有5个9,即99.999%。 这么多9代表什么意思呢? 首先,SLA的概念,对互联网...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,748
精华内容 28,699
关键字:

代理机制是什么意思