`
heiliguai
  • 浏览: 14451 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

InvocationHandler中invoke方法中的第一个参数proxy的用途

 
阅读更多

https://stackoverflow.com/questions/22930195/understanding-proxy-arguments-of-the-invoke-method-of-java-lang-reflect-invoca

 

There's in fact little you can do with the actual proxy. Nevertheless it's part of the invocation context, and you can use it to gain information on the proxy using reflection, or use it in subsequent calls (when calling another method with that proxy, or as a result.

Example: an acccount class, which allows to deposit money, whose deposit() method returns the instance again to allow method chaining:

privateinterface Account
   {
   publicAccount deposit (double value)
   publicdouble getBalance ();

   }

Handler:

private class ExampleInvocationHandler implements InvocationHandler{

privatedouble balance;

@Override

public Object invoke (Object proxy,Method method,Object[] args) throws Throwable

{// simplified method checks,
 would need to check the parameter count and types too

if("deposit".equals(method.getName())){

    Double value =(Double) args[0];

    System.out.println("deposit: "+ value);
            balance += value;

    return proxy;// here we use the proxy to return 'this'

}

if("getBalance".equals(method.getName())){

    return balance;
}

return null;
}

}

And an example of its usage:

Account account =(Account)Proxy.newProxyInstance

(getClass().getClassLoader(),

newClass[]{Account.class,Serializable.class},

newExampleInvocationHandler());// method chaining for the win!
account.deposit(5000).deposit(4000).deposit(-2500);

System.out.println("Balance: "+ account.getBalance());

As for your second question: the runtime type can be evaluated using reflection:

for(Class<?> interfaceType : account.getClass().getInterfaces()){

System.out.println("- "+ interfaceType);

}

And your third question: 'this' would refer to the invocation handler itself, not the proxy.

 
分享到:
评论

相关推荐

    InvocationHandler中invoke()方法的调用问题分析

    首先,invoke() 方法的完整形式是 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable,这个方法是 InvocationHandler 接口中的核心方法。在这个方法中,proxy 是代理类的实例,...

    InvocationHandler, Proxy机制

    `invoke`方法接受三个参数:被代理的对象、被调用的方法以及方法调用时的参数。开发者可以在这个方法中实现自定义的逻辑,例如日志、事务控制、性能监控等。 下面是如何创建和使用`InvocationHandler`的一个简单...

    Java动态代理实现 Proxy InvocationHandler

    - `Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)`:这个方法用于创建一个动态代理类的实例。参数分别表示类加载器、目标类实现的接口列表和一个`InvocationHandler`对象。...

    黑马程序员------代理类中invoke方法注意点

    在Java编程中,代理类(Proxy)是一种设计模式,它允许我们为已有对象创建一个代理对象,以便在调用实际对象的方法之前或之后添加额外的功能。`invoke`方法是Java动态代理中的核心方法,它位于`java.lang.reflect....

    Proxy & InvocationHandler

    `Proxy`通常与`InvocationHandler`接口一起使用,`InvocationHandler`定义了一个方法`invoke()`,当代理对象的方法被调用时,`invoke()`会被触发。 `InvocationHandler`接口包含一个方法: ```java Object invoke...

    java InvocationHandler

    `Proxy`类提供了静态方法`newProxyInstance`用于创建代理对象,它需要三个参数:一个类加载器、一个接口列表和一个`InvocationHandler`实例。 ```java Proxy.newProxyInstance( ClassLoader loader, Class[] ...

    invoke回调

    在Java编程中,回调是一种设计模式,它允许一个方法或函数在执行时调用另一个方法。回调机制常常用于异步编程或事件处理,使得代码在特定条件满足时能够执行特定的功能。在Java中,回调主要通过接口实现,尤其是当...

    java Proxy 动态代理

    Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **Proxy类**: - `Proxy.newProxyInstance()`是Proxy类的核心方法,用于创建代理对象。它需要三个参数:一个...

    Java动态代理[动态类Proxy的使用]

    我们可以创建一个`LoggingInvocationHandler`实现`InvocationHandler`,并在`invoke()`方法中插入日志代码,然后使用`Proxy.newProxyInstance()`创建代理对象并替换原来的`ServiceImpl`。 5. **注意事项**: - ...

    AOP修改方法的参数

    在这个类的 `invoke` 方法中,我们可以访问到目标方法的参数,并对其进行修改。 3. **创建代理对象**:通过 `Proxy.newProxyInstance` 方法创建代理对象。传递给这个方法的是业务接口的类加载器、接口数组以及 `...

    DynamicProxy源码

    - `InvocationHandler`接口定义了一个方法`invoke()`,它是处理代理对象上所有方法调用的核心。当通过代理对象调用任何方法时,实际上都会转到`invoke()`方法。在这个方法内部,你可以添加任何自定义逻辑,比如记录...

    详解设计模式中的proxy代理模式及在Java程序中的实现

    这个方法需要三个参数:一个类加载器,一个接口数组(代理对象需要实现的接口),以及一个InvocationHandler实例。InvocationHandler接口定义了一个`invoke()`方法,该方法会在代理对象的方法被调用时执行。 4. **...

    JavaProxy Demo

    3. **使用示例**:在ProxyDemo中,可能包含一个自定义的InvocationHandler实现,以及通过Proxy创建代理对象并调用其方法的过程。 **CGLIB动态代理**: 1. **Enhancer类**:CGLIB库中的`...

    Proxy代理模式经典实例(绝对OOP)

    `InvocationHandler`接口只有一个方法`invoke()`, 它接收三个参数:代理对象、调用的方法以及方法的参数。在`invoke()`方法中,我们可以添加额外的逻辑,如日志记录、权限检查等,并调用真实对象的方法来执行业务...

    深入理解JavaProxy机制.doc

    1. `Proxy.newProxyInstance()`方法接受三个参数:类加载器、接口列表和`InvocationHandler`实例。 2. 内部会根据传入的接口列表动态生成一个实现了这些接口的新类(类名通常为`$ProxyN`,N是生成的序号)。 3. 这个...

    java代理方法假设和验证的Proxy源码分析.docx

    在验证阶段,我们可以创建一个`InvocationHandler`实例,然后使用`Proxy.newProxyInstance()`创建代理对象。通过调用代理对象的方法,检查`InvocationHandler`的`invoke()`方法是否按预期工作。 总结来说,Java代理...

    jdk动态代理

    `Proxy`类是生成代理对象的工厂,它包含一个静态方法`newProxyInstance()`,这个方法需要三个参数:`ClassLoader`、`Interface[]`和`InvocationHandler`。`ClassLoader`用于确定代理类的加载器,`Interface[]`是代理...

    JDK-proxy-mode-spring-source-code-.zip_spring code

    首先,`InvocationHandler`接口是JDK代理的核心,它定义了一个方法`invoke(Object proxy, Method method, Object[] args)`。当通过代理对象调用方法时,实际执行的是`invoke`方法。`proxy`参数代表代理对象,`method...

    JDK动态代理proxy

    `InvocationHandler`接口只有一个方法 `invoke()`,它接收三个参数:代理对象、被调用的方法以及方法的参数数组。当通过代理对象调用任何接口方法时,实际执行的是这个`invoke()`方法。开发者需要实现这个方法,以...

    Proxy 模式学习代码

    1. **静态代理**:在静态代理中,我们需要为每个真实对象创建一个代理对象,并在代理类中实现与真实对象相同的方法。这样,当客户端调用代理对象的方法时,实际上会调用到代理类中相应的方法,从而可以添加额外的...

Global site tag (gtag.js) - Google Analytics