`
sinokaka
  • 浏览: 326212 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

动态代理类

    博客分类:
  • java
阅读更多
因为过去业务总是这样,在调用一个类的开始时候要执行某些操作,在执行后也要执行某些操作,这样我就写了一个动态代理类,来执行这些操作,可是他只能执行接口的方法,这样的话,每一个类,要想有这种功能,就要给自己的方法定义一个接口,这样很麻烦,能不能这个类没有接口,也可以使用动态代理类?
 
下面是我的实现
动态代理类
package Proxy;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 

public class MethodProxy implements InvocationHandler {
   
    /*
     * 代理对象的实例
     */
    private Object wrapped;
   
    /*
     * 私有的构造方法,不能实例化
     */
    private MethodProxy(Object p) {
        wrapped = p;
    }
   
    /**
     *  实现InvocationHandler接口的方法
     */
    public Object invoke(Object proxy, Method method, Object[] args)
           throws Throwable {
        System.out.println("调用"+method.getClass().getName() + "." + method.getName()+"开始");
        Object obj = method.invoke(wrapped, args);
        System.out.println("调用"+method.getClass().getName() + "." + method.getName()+"结束");
        return obj;
    }
   
   
    public static Object createBuilder(Object toWrap) {
        return Proxy.newProxyInstance(toWrap.getClass().getClassLoader(),
                toWrap.getClass().getInterfaces(),
                new MethodProxy(toWrap));
    }
}
 
测试类
package Proxy;
 

public class TestProxy {
    public static void main(String[] args) {
        IPerson p = (IPerson)MethodProxy.createBuilder(new Person());
        p.say();
        ICat c = (ICat)MethodProxy.createBuilder(new Cat());
        c.catchMouse();
        IPerson pc = (IPerson) c;
        pc.say();
    }
}
 
几个实现
接口
package Proxy;
 
public interface ICat {
    public void catchMouse() ;
}
 
package Proxy;
 
public interface IPerson {
    public void say();
}
 
实现
 
package Proxy;
 

public class Cat implements ICat,IPerson {
 
    /* (non-Javadoc)
     * @see Proxy.ICat#catchMouse()
     */
    public void catchMouse() {
       System.out.println("mouse");
    }
   
    public void say() {
        System.out.println("I'm cat");
    }
 
}
 
package Proxy;
 
public class Person implements IPerson{
   
    public void say() {
        System.out.println("Hello");
    }
 
}
 
分享到:
评论

相关推荐

    spring动态代理类的示范小版本,很简单的例子

    这个"spring动态代理类的示范小版本,很简单的例子"应该是提供了一个简单易懂的示例,帮助我们理解Spring动态代理的工作原理。 在Spring中,动态代理主要有两种实现方式:JDK动态代理和CGLIB代理。它们都是为了实现...

    代理类,详细讲解一下动态代理类

    动态代理类是这种机制的一个变体,尤其适用于运行时生成代理类的情况。接下来,我们将详细讨论动态代理类的概念、其作用以及如何在实际开发中应用。 首先,代理类的主要作用在于提供额外的控制层。当直接调用目标...

    CGLIB 和 JDK生成动态代理类的区别

    性能方面,CGLIB通常比JDK动态代理更快,因为它是基于字节码生成的子类,而JDK动态代理需要创建接口的实现类。但是,如果目标类已经实现了接口,JDK动态代理的性能开销相对较小,因为它避免了子类继承带来的额外成本...

    动态代理类例子proxy

    动态代理类例子proxy动态代理类例子proxy动态代理类例子proxy

    对代理模式与Java动态代理类的理解

    对代理模式与Java动态代理类的理解说明

    动态代理及生成的代理类

    动态代理及其生成的代理类,可以反编译查看其类的结构。

    java 简答可复用动态代理类

    - `Proxy`类是Java提供的动态代理的工厂,它可以根据一个接口生成实现了该接口的代理类的对象。这个代理类会动态地生成并实现接口的所有方法。 - `InvocationHandler`接口定义了一个处理方法调用的回调方法`invoke...

    java动态代理类的实例

    在Java中,静态代理是通过定义一个与被代理类实现相同接口的新类来实现的,而动态代理则在运行时动态生成此类,无需预先编写代理类的代码。 `java.lang.reflect.Proxy`类是Java动态代理的核心,它提供了创建代理...

    CGlib动态代理类的jar包

    在Java编程中,动态代理是一种在运行时创建代理类和对象的技术,可以用于拦截方法调用,实现AOP(面向切面编程)或者为已有接口或类提供额外功能。CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,...

    Java静态代理和动态代理

    动态代理类不需预先编写,而是由JVM在运行时根据接口动态生成。这样,我们可以通过接口而不是具体类来创建代理,使得代码更加灵活。 四、静态代理与动态代理的比较 1. **灵活性**:动态代理比静态代理更灵活,因为...

    Mybatis的Mapper方式整合elasticsearch的DSL调用,基于接口和代理生成bean注入的方式进行调用

    为了解决这个问题,我们可以利用CGlib库来创建动态代理类。CGlib是一个强大的字节码生成库,它可以在运行时生成新的类和接口的实例,这正是我们需要的——为每个Mapper接口创建一个代理类,以便在调用实际方法之前...

    关于jdk动态代理的源码剖析

    3. **内部持有`InvocationHandler`实例**:动态代理类内部持有一个`InvocationHandler`实例,这个实例用于处理代理对象的所有方法调用。 #### 五、动态代理的核心——`InvocationHandler` `InvocationHandler`是...

    JAVA类加载机制与动态代理

    - **动态语言支持**:例如使用`java.lang.reflect.Proxy`类来创建动态代理类。 - **自定义代码生成**:通过编写代码来手动生成代理类的字节码。 ##### 2.2 动态代理的概念 动态代理允许我们为一个接口创建一个代理...

    java动态代理实现详解

    在生成动态代理类时,需要提供一个类加载器来确保代理类能够被正确加载和使用。 使用Java动态代理的步骤: 1. 实现`InvocationHandler`:创建一个类实现`InvocationHandler`接口,重写`invoke()`方法。在这里可以...

    CGLIB动态代理类库

    对目标对象进行继承扩展,为其生成相应的子类,而子类可以通过覆写来扩展父类的行为,只要将横切逻辑的实现放到子类中,然后让系统使用扩展后的目标对象的子类,就可以达到与代理模式相同的效果了。

    JDK动态代理_JDK动态代理

    - **`java.lang.reflect.Proxy`**:提供了创建动态代理类和实例的方法。通过`newProxyInstance`方法,传入ClassLoader、接口数组和InvocationHandler实例,即可创建一个动态代理对象。 - **`java.lang.reflect....

    java动态代理机制分析及拓展

    2. `getProxyClass`: 根据类装载器和一组接口返回动态代理类的类对象。 3. `isProxyClass`: 判断指定的类是否是动态代理类。 4. `newProxyInstance`: 使用类装载器、一组接口和调用处理器生成动态代理类实例。 **...

    jdk动态代理技术详解

    Proxy 类是 JDK 中的动态代理类,是动态代理的核心类,其作用类似于代理模式中的代理。Proxy 类中包含的全是静态的方法和成员变量,这是一个纯粹的工具类,因此其源代码中含有一个私有的构造器,在某种意义上可以看...

    Java动态代理学习测试类

    在这个“Java动态代理学习测试类”中,我们将深入探讨这一主题。 1. **Java动态代理的基本概念** - 动态代理是在程序运行时生成接口的实现类,而无需在编译时就确定。这使得我们可以在运行时决定代理对象的行为。 ...

Global site tag (gtag.js) - Google Analytics