您的当前位置:首页java之JDK动态代理是什么

java之JDK动态代理是什么

2024-07-17 来源:六九美食网

1、说明

Java中提供了一个动态代理类 Proxy,Proxy 并不是我们所说的代理对象的类,而是提供了一个创建代理对象的静态方法(newProxyInstance)来获取代理对象。

2、实例

public class HelloWorld {
    public static void main(String[] args) {
        // 获取代理对象
        ProxyFactory factory = new ProxyFactory();
        
        SellTickets proxyObject = factory.getProxyObject();
        
        proxyObject.sell();
    }
}
 
// 卖票接口
interface SellTickets {
    void sell();
}
 
// 火车站,火车站具有卖票功能,所以需要实现SellTickets接口
class TrainStation implements SellTickets {
    @Override
    public void sell() {
        System.out.println("火车站卖票");
    }
}
 
// 代理工厂,用来创建代理对象
class ProxyFactory {
    private TrainStation station = new TrainStation();
 
    public SellTickets getProxyObject() {
        // 使用Proxy获取代理对象
 
        /**
         * newProxyInstance() 方法参数说明:
         *  ClassLoader loader: 类加载器,用于加载代理类,使用真实对象的类加载器即可
         *  Class<?>[] interfaces:真实对象所实现的接口,代理模式真实对象和代理对象实现相同的接口
         *  InvocationHandler h:代理对象的调用处理程序
         */
 
        SellTickets sellTickets = (SellTickets) Proxy.newProxyInstance(
                station.getClass().getClassLoader(),
                new InvocationHandler() {
                    /**
                     * InvocationHandle中invoke方法参数说明:
                     *  proxy:代理对象
                     *  method:对应于在代理对象上调用的方法的Method实例
                     *  args:代理对象调用接口方法是传递的实际参数
                     */
                    
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("代理点收取一些服务费用(JDK动态代理方法)");
                        
                        // 执行真实对象
                        Object result = method.invoke(station, args);
                        return result;
                    }
                });
        return sellTickets;
    }
}

以上就是java之JDK动态代理的基本介绍,希望能对大家有所帮助。

六九美食网还为您提供以下相关内容希望对您有帮助:

jdk动态代理的优缺点

JDK动态代理是一种基于Java反射机制的代理模式实现方式。其主要优点在于灵活性和通用性。由于动态代理可以在运行时动态创建代理类,因此可以很方便地对不同的接口进行代理,从而实现通用的代理逻辑。此外,动态代理还可以根据需要灵活地添加额外的功能,例如日志记录、性能监控等。然而,JDK动态代理也存在一些缺...

动态代理是什么意思

动态代理是指在运行时动态地创建一个代理类以实现特定的功能,而不是在编码时固定地创建代理类。它是利用反射机制来生成一个代理对象,该代理对象可以替代原始对象,当客户端调用代理对象时,实际上是调用原始对象的方法,在代理对象中可以加入额外的逻辑操作。动态代理主要的应用场景是AOP(面向切面编程)。

jdk动态代理可以代理final方法吗

JDK动态代理是Java提供的一种代理机制,利用反射机制在运行时动态生成代理类对象,并通过代理类来间接访问目标对象的方法。

JDK 动态代理与 CGLIB 动态代理,它俩真的不一样

JDK 动态代理与 CGLIB 动态代理的区别和使用场景理解这两者的关键在于它们的实现原理和效率。JDK动态代理基于拦截器和反射,通过创建一个实现了InvocationHandler接口的匿名类,对方法调用进行拦截。CGLIB则是利用ASM框架,通过修改代理对象的字节码来生成子类,实现动态代理。在性能方面,早期的JDK(如6、7)在...

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

动态代理:应用程序发布后,通过动态创建代理对象。静态代理其实就是一个典型的代理模式实现,在代理类中包装一个被代理对象,然后影响被代理对象的行为,比较简单,代码就不放了。其中动态代理又可分为:JDK动态代理和CGLIB代理。1.JDK动态代理 此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象...

Java 几种动态代理实现及其性能比较

1. 动态代理是指在运行时,动态生成代理类。代理类的字节码将在运行时生成并载入当前的ClassLoader.生成动态代理类的方法很多,如JDK自带的动态代理、CGLIB、Javassist或者ASM库。JDK动态代理使用简单,它内置在JDK中,因此不需要引入第三方Jar包,但相对功能比较弱。CGLIB和Javassist都是高级的字节码生成库...

Spring的两种代理JDK和CGLIB的区别浅谈

Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以...

jdk的动态代理和cglib动态代理的区别

1、Jdk动态代理实例:JDK动态代理只能代理实现了接口的类,其他普通类不能实现。代理类会在newProxyInstance方法中生成 2、cglib动态代理:cglib是针对类实现代理的,为代理的类生成一个子类,覆盖方法实现增强,因为采用的是继承所以不能代理final修饰的类。需要cglib和asm两个jar包 ...

静态代理,JDK动态代理和CGLib动态代理之前的区别

JDK动态代理类实现了InvocationHandler接口。在重写的invoke方法中可以看出,JDK动态代理的基础是反射(method.invoke(对象,参数)),还好反射看的比较多,到现在还记得。在这里需要提到的是Proxy.newProxyInstance(),这个方法。字面上的意思是 新建一个代理类的实例,这一点就和静态代理不同了。里面的参数...

JDK代理和CGLIB动态代理生成class文件

1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂, 生成代理类比JDK效率低 。3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行...

显示全文

猜你还关注