反射 和 动态代理
反射 和 动态代理
刘付kin 发表于1年前
反射 和 动态代理
  • 发表于 1年前
  • 阅读 5
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

#一:Java的反射======

为什么要用到反射,主要是因为有时候我们并不能够直接使用new来创建一个对象,因为我们只知道这个类的名字,这个时候就需要反射。

  • 1:首先第一步,一定要先用类名来获取到这个类的字节码 Class personclass = Class.forName("classname");

  • 2:接着在使用这个类字节码来做各种各样的事情,比如:

    “远程过程调用的时候就需要用到这种方式”

      class直接创建默认的对象 .newInstance(),这个只能够调用默认的无参构造方法。
      class获取构造器,通过构造方法的参数类型来获得	“这个比较难知道里面有哪些构造方法”
      class获取成员(私有和共有)	  因为可以在json字符串中指定调用的变量名字,
      calss获取方法(私有和共有)	  因为可以在json字符串中指定调用的方法名字,
      class获得接口class
      class获得直接的父类class
      处理完的结果,再以json的格式返回给调用方即可。
    

#二:代理,其实就用到了反射的机制,在代理中通过类名反射到class。

/**
   * [@param](https://my.oschina.net/u/2303379) interfaceClass
   * 这个代理方法,不是为了执行被代理类的方法,而是为了获得将要执行的:类名、方法名和方法的参数。
   * 这是不是就很适合用于rpc远程调用所需要的“类名、方法名和参数”等信息获取?
   * 封装成一个map对象->json字符串->发送-----------服务器端->解析json为一个对象->反射类对象->调用方法->返回结果
   */
 public static Object getProxyBossForName(final Class<?> interfaceClass){
  Object obj = Proxy.newProxyInstance(
    interfaceClass.getClassLoader(), 
    new Class[]{interfaceClass}, 
    new InvocationHandler() {
     [@Override](https://my.oschina.net/u/1162528)
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      //不管调用了这个被代理类的那个方法,这边都会被调用。
      /**
       * do samething!!!!!!!!!!!!!!
       */
      System.out.println("被代理对象的这个方法被调用了:" + method.getName());
      return null;
     }
    }
  );
  return obj;
 }
 
 /**
  * [@param](https://my.oschina.net/u/2303379) interfaceClass
  * 这个代理方法,主要是为了执行原来的方法,然后在它的结果之上,在进行一些处理。比如:电商的打折,优惠券等等。
  */
 public static Object getProxyBossForRun(final Class<?> implementsClass){
  Object obj = Proxy.newProxyInstance(
    implementsClass.getClassLoader(),
    implementsClass.getInterfaces(),
    new InvocationHandler() {
     [@Override](https://my.oschina.net/u/1162528)
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      /**
       * do samething!!!!!!!!!!!!!!
       */
      String result = (String) method.invoke(implementsClass.newInstance(), args);
      System.out.println("被代理对象的这个方法被调用了:" + method.getName() + " 结果是:" + result);
      return null;
     }
    }
  );
  return obj;
 }

#总结:

-反射:当我们无法直接使用new去创建一个类对象的时候,就需要用到反射机制

  • 反射机制可以通过一个字符串名字获得这个类的class,然后再通过这个class创建一个对象同时还可以获取这个类的所有信息,包括成员变量和成员方法(共有的和私有的)。

#创建一个对象的四种方式:

  • 1:最简单的new

  • 2:通过

      Class personclass = Class.forName("classname");   	
      personclass .newInstance()
    
  • 3:序列化,

      也就是implements Serializable,
      ObjectOutPutStream  
      ObjectInPutStream
    
  • 4:对象克隆

#动态代理:(主要代理对象的方法,也就是可以获得方法名字)

不改变原有的业务逻辑代码的基础上,对原有逻辑进行修改处理,只要知道那个模板结构就行了。 运用场景:

  • 1.)远程rpc时,获取调用的方法名字。
  • 2.)功能增强,比如商品打折等功能。
共有 人打赏支持
粉丝 6
博文 100
码字总数 72832
×
刘付kin
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: