文档章节

反射 和 动态代理

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

© 著作权归作者所有

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

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

努力的右先生 ⋅ 2017/11/07 ⋅ 0

反射实现动态代理原理

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

marjey ⋅ 2016/10/24 ⋅ 0

知识总结之 插件化基础 java反射与代理

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

CankingApp ⋅ 2017/05/10 ⋅ 0

java反射与代理

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

wf王帆 ⋅ 2016/07/24 ⋅ 0

Java反射机制

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

ciyo_yang ⋅ 2017/06/26 ⋅ 0

Java反射笔记

Java反射机制是指在运行状态中,对于任意一个类,都知道这个类的所有属性和方法;对于任意一个对象,都能调用它的属性和方法,反射功能十分的强大,但是使用反射的成本比较高。 Sun公司提供的...

黄步欢 ⋅ 2017/05/16 ⋅ 0

静态代理与动态代理实现与原理

基础代码准备 接口类: public interface IUser { /** * 判断用户的权限 * @param uid 用户的UID * @return / public boolean isAuthUser(int uid);} 实现类: /* * 类的实现 * @author Jaso......

ifree613 ⋅ 2016/03/11 ⋅ 0

Spring原理概述

1、spring原理 spring的最大作用ioc/di,将类与类的依赖关系写在配置文件中,程序在运行时根据配置文件动态加载依赖的类,降低的类与类之间的藕合度。它的原理是在applicationContext.xml加入...

凯文加内特 ⋅ 2014/02/13 ⋅ 0

JDK动态代理和cglib的动态代理

JDK动态代理和cglib的动态代理 1、代理 代理在java中用多,主要用来对已有功能做扩展和适配。动态代理就涉及到了反射、jvm的类加载机制等信息。一般用在框架中。例如:spring的AOP就是用动态...

GITTODO ⋅ 2016/04/13 ⋅ 0

当泛型的参数类型是动态的(转)

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 出自:http://www.cnblogs.com/zhuweisky/archive/2007/04/26/728635.html 在使用泛型技术时,我们经常......

技术小牛人 ⋅ 2017/11/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部