0 0

动态代理为什么必需要实现一个接口?10

  我有一个类如下
     Class MyClass {
           public void doBiz(...);
     }

  我想拦截doBiz(...)这个方法,但又不能新创建一个接口, 我应该怎么去实现

  补充: 如果不定义接口, 当
 
    (MyClass obj = (MyClass)Proxy.newProxy...(classLoader, new Class[]{}, handler)
  

  的时候会报ClassCastException
问题补充:
  适配器好像也解决不了这个问题, 如果没有接口, 那只能通过组合来适配(如果下面的代码给的不合适, 请指出*^+^*):
    class Adapter {
          Object target;
          public Adapter(Object _target){
               target = _target;
          }
          .....
    }

问题来了, 这个适配器方法如何定义? 以达到拦截target方法的目的


问题补充:
  因为被适配的对象target是不固定的: 数量不固定, 其方法也不固定, 所以不可能一个target来创建一个适配器的
2008年11月20日 17:14

2个答案 按时间排序 按投票排序

0 0

这个需求貌似不是做Adapter, Adapter,肯定知道target对象的类型和方法, 才对外做Adapter;

如果你不知道目标类型,方法; 上面的代理同样无法实现; 只能靠反射了. 反射就需要接口了. 如果你有了接口了. 上面的代理也就可以实现了.

2008年11月21日 10:01
0 0

我的理解: 接口是种规范; 动态的对象,根据这个规范去执行Method;如果是Class;就没了这个规范;


为什么非要用动态代理呢?

继承 或者 加一层间接的 Adapter 不也可以达到你的目的?

2008年11月20日 20:10

相关推荐

    Java动态代理两种实现方式

    Java动态代理技术是Java编程中一个非常重要的特性,它允许我们在运行时动态创建具有特定行为的对象。这种技术常用于AOP(面向切面编程)和框架中,如Spring AOP,用于实现方法拦截、事务管理等功能。Java提供了两种...

    Java实现动态代理

    CGLIB通过创建目标类的子类来实现动态代理,所以不需要目标类实现接口。 首先,需要引入CGLIB库,然后使用`net.sf.cglib.proxy.Enhancer`类来创建代理对象。Enhancer提供了丰富的API来定制代理对象的行为,比如...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中动态生成类和对象。 在Spring AOP中,我们通常使用@Aspect注解...

    Spring框架中JDK动态代理和cglib动态代理

    JDK 动态代理为什么必须使用接口?这主要是因为 JDK 动态代理是基于接口的代理,它需要一个接口来生成代理类。如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类交给 JDK 动态代理来生成代理类。这样...

    浅谈JDK动态代理与CGLIB代理去区别

    JDK动态代理的局限性在于,它只能为实现了至少一个接口的类创建代理,因为代理对象必须继承自这些接口。这种方式适用于那些基于接口进行编程的设计,比如Spring AOP中的Advisor和Advice。 相反,CGLIB(Code ...

    CGlib实现动态代理(承接上面JDK实现动态代理)

    CGlib是Java编程语言中的一个库,主要用于生成子类,以此实现对现有类的动态代理。它是基于ASM库,能够直接操作字节码,从而在运行时创建新类的实例。在Java中,CGlib是一个非常重要的工具,特别是在AOP(面向切面...

    jdk与cglib动态代理与底层实现

    在Java编程领域,代理模式是一种常见且重要的设计模式,它允许我们为一个对象提供一个代理以控制对该对象的访问。代理模式在实际应用中广泛用于数据缓存、权限控制、事务处理等方面。JDK和CGLIB是Java中实现动态代理...

    动态代理例子

    - 首先,你需要有一个接口,这个接口定义了代理对象需要实现的所有方法。 - 然后,创建一个实现InvocationHandler接口的类,重写invoke()方法。 - 最后,使用Proxy.newProxyInstance()创建代理对象,传入接口类型...

    动态代理实现AOP机制

    如果没有实现接口,Spring则会使用CGLIB代理。 AOP在Spring中的实现还涉及了切点(Pointcut)、通知(Advice)、切面(Aspect)、织入(Weaving)等概念。切点定义了哪些方法会被切面关注,通常通过表达式或注解来...

    ioc框架,通过动态代理实现.

    在学习和应用IOC框架,尤其是通过动态代理实现时,我们需要了解以下知识点: 1. IOC的基本原理和实现机制,包括依赖注入(Dependency Injection)的概念。 2. 如何配置IOC容器,如XML配置或注解配置。 3. 如何使用...

    静态代理动态代理测试,模拟jdk实现动态代理

    在这个例子中,`DynamicProxy`实现了`InvocationHandler`接口,`getProxyInstance`方法返回的是一个动态生成的代理对象,这个代理对象能够调用`RealServiceImpl`的方法并附加额外的操作。 在实际应用中,动态代理常...

    springboot中的 动态代理的选择测试代码

    另外,CGLIB是一个强大的高性能的代码生成库,它可以用来扩展Java类与实现Java接口,并且提供了一个API来动态地创建代理对象。 在Spring Boot中,AOP(面向切面编程)是通过动态代理实现的,用于解耦核心业务逻辑和...

    动态代理接口并注册到spring容器

    在本案例中,我们将探讨如何实现一个动态代理接口并将其注册到Spring容器,以便于通过@Autowired注解或其他方式在Spring应用中使用。 首先,我们需要定义一个接口,例如`MyService`,这个接口包含了我们需要代理的...

    三种动态代理的实现

    下面将详细讨论三种主要的动态代理实现方式:静态代理、JDK动态代理和CGLIB动态代理。 1. 静态代理: 静态代理是最基础的形式,它需要程序员手动编写代理类。代理类和真实对象实现了相同的接口,代理类在调用实际...

    静态代理和动态代理简单实现代码

    在Java编程中,代理模式是一种常用的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能、控制访问权限或者在调用目标对象之前和之后添加一些操作。这里我们将深入...

    javassit实现动态代理解决代理必须要接口的缺憾

    3. ** 动态代理实现 **: 在Javaassist中,我们可以创建一个代理类,该类在运行时会拦截调用并执行自定义逻辑。这通常通过重写`invoke()`方法实现。代理类可以继承自目标类(如果目标类是final的,可以使用组合),...

    Emit实现动态代理

    下面是一个简单的例子,展示了如何使用Emit实现一个动态代理: ```csharp using System; using System.Reflection; using System.Reflection.Emit; public delegate void MyDelegate(int value); public class ...

    JAVA实现动态代理的简单流程

    这是因为Java动态代理的核心在于生成一个实现了特定接口的代理对象,因此必须先有接口作为代理的基础。 ```java interface AA { void method(); } class Ab implements AA { @Override public void method() { ...

    java-jdk动态代理的实现demo

    这个方法需要三个参数:一个类加载器,一个接口数组(表示代理对象需要实现的接口),以及一个`InvocationHandler`实例。 ```java public static Object newProxyInstance(ClassLoader loader, Class<?>[] ...

Global site tag (gtag.js) - Google Analytics