java反射机制,动态代理 基于原理的解析

    Java反射机制,动态代理是基于什么原理?
    反射机制是java中重要的一种基础功能,引入程序运行时自省的能力 。通过反射,可以直接操作类或者对象,如获取类的定义,获取类声明的属性和方法,调用方法,构造对象等。

     动态代理是一种方便运行时构建代理,动态处理代理方法调用的机制,AOP面向切面编程就是利用类似的代理机制实现,实现动态代理的方式有以下几种:jdk自身提供的动态代理,cglib,javassist。

     反射,引入运行时自省能力,赋予了Java语言额外的活力,通过运行时操作元数据或对象, Java可以灵活地操作运行时才能确定的信息。动态代理,是延伸出来的一种广泛应用于产品开发中的技术,很多繁琐的重复编程,都可以被动态代理机制优雅地解决。

    JDK动态代理的例子:

public class MyProxy {
    public static void main( String[] args ) {
        HelloWorldImpl helloWorld = new HelloWorldImpl();
        MyInvocationHandler handler = new MyInvocationHandler(helloWorld);
        //构造代码实例
       HelloWorld proxyInstance = (HelloWorld) Proxy.newProxyInstance(HelloWorldImpl.class.getClassLoader(),
                HelloWorldImpl.class.getInterfaces(), handler);
       
/*     newProxyInstanced的方法解析
        public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
        loader:      一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
        interfaces:  一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
        h:           一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
*/
        // 调用代理方法
        proxyInstance.sayHello();
    }
}

interface HelloWorld{
    void sayHello();
}

class HelloWorldImpl implements HelloWorld{
    @Override
    public void sayHello() {
        System.out.println("helloworld");
    }
}
//实现动态代理的接口
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("动态代理 sayhello");
        Object result = method.invoke(target, args);
        System.out.println(result+"=====");
        return result;

    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值