Java反射与 JDK代理调用

    最近由于项目须要温习Spring的时候,看到有一章节讲的是JDK代理调用,因此就结合公司的Invoke代理调用再一次看了一遍代理这一块。java

    1、反射

    一般java中都是由java类编译成class文件,即先有类再有对象,那么有了对象以后咱们就能够调用对象的方法和属性。可是经过反射咱们能够经过Class对象来调用类里面的方法。经过反射能够调用私有方法和私有属性。大部分框架都是运用反射原理。spring

    这是获取class对象的三种方式编程

//一、经过对象调用 getClass() 方法来获取,一般应用在:好比你传过来一个 Object
 //  类型的对象,而我不知道你具体是什么类,用这种方法
   Person p1 = new Person();
   Class c1 = p1.getClass();
         
 //二、直接经过 类名.class 的方式获得,该方法最为安全可靠,程序性能更高
 //  这说明任何一个类都有一个隐含的静态成员变量 class
    Class c2 = Person.class;
         
 //三、经过 Class 对象的 forName() 静态方法来获取,用的最多,
 //   但可能抛出 ClassNotFoundException 异常
   Class c3 = Class.forName("com.ys.reflex.Person");

2、动态代理

    关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另外一个对象(目标对象),这时能够应用代理模式在这二者之间构建一个桥梁--代理对象。 按照代理对象的建立时期不一样,能够分为两种: 静态代理:事先写好代理对象类,在程序发布前就已经存在了; 动态代理:应用程序发布后,经过动态建立代理对象。安全

    动态代理:应用程序发布后,经过动态建立代理对象。框架

3、JDK动态代理

    JDK动态代理只能针对实现了接口的类生成代理性能

public Object newProxy(Object targetObject) {// 将目标对象传入进行代理 
    this.targetObject = targetObject;  <br>    //注意这个方法的参数,后面是实现类实现的接口
    return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), 
            targetObject.getClass().getInterfaces(), this);// 返回代理对象

在上面的代码中,咱们知道,jdk传入的实际上是实现类所实现的接口 flex

targetObject.getClass().getInterfaces(), 因此jdk动态代理只能对接口Interface进行代理。this

4、动态代理的应用spa

   动态代理还有一种是Cglib,是实现不是接口的类的动态代理。代理

    AOP(Aspect-OrientedProgramming,面向切面编程),AOP包括切面(aspect)、通知(advice)、链接点(joinpoint),实现方式就是经过对目标对象的代理在链接点先后加入通知,完成统一的切面操做。

实现AOP的技术,主要分为两大类:

一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;

二是采用静态织入的方式,引入特定的语法建立“方面”,从而使得编译器能够在编译期间织入有关“方面”的代码。

Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪一种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。

默认的策略是若是目标类是接口,则使用JDK动态代理技术,若是目标对象没有实现接口,则默认会采用CGLIB代理。

若是目标对象实现了接口,能够强制使用CGLIB实现代理(添加CGLIB库,并在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)。

相关文章
相关标签/搜索