文档章节

反射 和 动态代理

刘付kin
 刘付kin
发布于 2016/12/08 21:25
字数 869
阅读 7
收藏 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.)功能增强,比如商品打折等功能。

© 著作权归作者所有

共有 人打赏支持
刘付kin
粉丝 6
博文 98
码字总数 71383
作品 0
深圳
Java基础之反射

image 前言 所谓工欲善其事必先利其器,只有把脚下的每一步走好,才能走的更远,只有把地基打的牢固,才能盖的更高。今天我来给大家讲讲java中的反射,如有错误请指出。 概述 反射(Reflect...

努力的右先生
2017/11/07
0
0
反射实现动态代理原理

我记得在spring中有用到在xml文件中配置一些类和方法,然后在实际调用这些类的方法的时候依照配置文件的信息,在运行这些方法的同时(前、后)。同时调用一些已经配置好的方法(比如说日志记录...

marjey
2016/10/24
65
0
知识总结之 插件化基础 java反射与代理

Java平台的反射机制是代码动态加载和调用的基本途径,在安卓系统源码中也用到了大量的反射动态加载类。反射也是安卓平台插件化实现的必要掌握的基础知识。代理是客户端灵活操作对象,间接的低...

CankingApp
2017/05/10
0
0
java反射与代理

Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC、AOP就是通过反射机制与动态代理实现的。 1 Java反射 示例: User user = new User();user.setTime5Flag("test"); Class<?> c...

wf王帆
2016/07/24
55
0
Java反射机制

1.反射机制是什么 Reflection(反射)是被视为动态语言的关键,反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法...

ciyo_yang
2017/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Oracle return exit continue

常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then dbms_output.put_line('i < 5, i = ' || to_char......

taadis
今天
3
0
JSONObject 转换时出错 InvocationTargetException

JSONObject 转换时出错java.lang.reflect.InvocationTargetException 一时看不出来是什么问题。 挺奇怪的。 百度参考了一下这个 网页的解决方案 说是类型不对,空? 仔细查看代码,果然是有一...

之渊
今天
3
0
no such module 'pop'问题

在github上 clone 了一个 swift 项目,编译时提示"no such module 'POP'"错误,查了一下居然是因为podfile中指定的最低版本是iOS 11.0,大于我测试手机的iOS版本10.3.3,将Podfile中的最低版...

yoyoso
今天
3
0
redis 系列一 -- 简介及安装

1.简介 redis -- remote dictionary server 远程字典服务 使用 C 语言编写; 高性能的 key-value数据库; 内存数据库,支持数据持久化。 Redis 是一个开源(BSD许可)的,内存中的数据结构存...

imbiao
今天
4
0
nginx log记录请求响应时间

有时为了方便分析接口性能等,需要记录请求的时长,通过修改nginx的日志格式可以做到,如 添加一个新的log_format log_format timed_combined '$remote_addr - $remote_user [$time_local] "...

swingcoder
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部