动态代理
代理的作用就是控制对象的访问权限;

首先我们需要写一个接口 这个就是代理接口

public interface Student {
public  void S1();
}

然后在写一个接口的实现类 这个是原类


public class StudentImpl implements Student {private String name;public StudentImpl() {};public StudentImpl(String name) {this.name = name;};public String getName() {return name;}public void setName(String name) {this.name = name;}public void holler() {System.out.println("holler ");}public void S1() {this.holler();System.out.println("我是S1");}
}

我们还需要写一个生成代理对象的工厂


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyFactory implements InvocationHandler {private Object object = null;public Object getp(Object object) {this.object = object;return Proxy.newProxyInstance(this.object.getClass().getClassLoader(),this.object.getClass().getInterfaces(),this);}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {StudentImpl si = (StudentImpl) this.object;Object o = null;if (si.getName() != null) {o = method.invoke(this.object, args);StudentImpl ss = (StudentImpl)o;System.out.println(ss.getName());}else{System.out.println("你的权限不足。");}return o;}
}

在这个工厂里面调用 proxy 的构造方法 newProxyInstance 传入相关参数 会返回一个对应的代理对象

我们可以看一下里面的源码

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException{if (h == null) {throw new NullPointerException();}Class<?> cl = getProxyClass0(loader, interfaces); try {final Constructor<?> cons = cl.getConstructor(constructorParams);final InvocationHandler ih = h;SecurityManager sm = System.getSecurityManager();if (sm != null && ProxyAccessHelper.needsNewInstanceCheck(cl)) {return AccessController.doPrivileged(new PrivilegedAction<Object>() {public Object run() {return newInstance(cons, ih);}});} else {return newInstance(cons, ih);}} catch (NoSuchMethodException e) {throw new InternalError(e.toString());} }

在这个方法返回的时候又调用了 newInstance,显然这个方法是做创建代理对象的

最后在写一个代理的测试类

package proxytest;import java.lang.reflect.Proxy;public class Test {public static void main(String[] args) {Student student = new StudentImpl("ss");ProxyFactory pt = new ProxyFactory();Student  pro = (StudentImpl)pt.getp(student);pro.S1();}
}

输出结果:
holler
我是S1

总结

动态代理是在静态代理的基础上进行优化和补充,实现的步骤为
1.编写一个代理接口
2.编写一个接口实现类
3.编写一个代理的的创建工厂
4.测试类。调用工厂传入需要代理的对象

动态代理是在程序员需要时,程序会根据jdk的反射机制对需要的代理类进行加载, 这是动态代理的最大特点,虽然
这点在小程序里面的不到体现,但是在加载大文件时,差异就很明显了, 动态代理中利用了java中的 proxy 类
这是一个创建代理对象的类,上面我们用到了他的构造方法,其内部就是对代理类的加载 预编译的实现过程;
静态代理模式会在程序运行之前,先把代理对象编译成class文件,这是静态代理和动态代理的根本区别
在spring中就有代理这个功能,其实现原理也是相同的,spring中在对象上加上注解或重写其set方法就可以了;
(篇外话)
我们常用的spring框架中的 DI (依赖注入)的实现原理就是跟以上类似。

spring IOC/DI
我们来延伸一下上面的内容,既然说到spring,那么大家对spring 的核心想必都不陌生了吧,没错,它们就是AOP(面向切面编程) 和 IOC(控制反转), 那我们主要讲讲IOC。
IOC 全称 (Inversion of Control) ,中文叫 “控制反转”,那我们怎么来理解这个控制反转呢? 首先我们需要知道 IOC的定义是什么,这样我们才能快速的去理解他, IOC 定义: 就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系。 我们可以大概理解成 IOC就是一个用来创建依赖关系的工具, 为什么不是我们自己来创建这个依赖关系呢,听我娓娓道来, 现在的项目结构一般都是以MVC模式来搭建的,这样代码的规范和维护性就比较高了,当业务逻辑层需要用到其他服务(方法)时,我们通常需要先NEW出这个对象,在用对象调用我们需要的服务,看上去这样很简单,但是仔细想想,我们每次都需要亲力亲为,如果业务复杂度高的话,就算马云也会力不从心吧,并且new出来的这些对象也不好管理,就好像一个没有分类的菜市场,杂七杂八的东西到处都是,对于开发来讲,这样的结果肯定不是我们想见到的,所以我们把这个繁琐的过程就交给spring来处理,简单来讲 IOC 就是一个提供对象依赖的服务,我们来举一个例子:
在没有淘宝之前,我们买东西都需要去商店百货自己找,找完需要的东西之后还要付款,之后还要自己带回家,可能在超市里面有些需要的东西已经卖完了,这样白跑一趟,效率低还费心费力,
有淘宝之后,我们可以直接在手机或者电脑上选购,选购之后直接送货到家 ,免去了中间的一些繁杂的过程,这样我们还能把这个时间省下来,去做更多的事情。
总结:
1.IOC是什么? IOC是处理对象依赖关系的一种技术,
2. 为什么需要IOC? 原始的方式效率太低。
3. IOC的处理流程:其底层原理用的就是动态代理。

IOC 大致分为三种方式:
1.对象的 getter/setter,首先私有化其对象,在构建对象的无参构造方法
private A a;
public viod setA(A a){
this.a = a
}

2.构造器注入
A(A a){
this.a = a;
}

3.注解注入,注解是spring 自带的,私有化对象后,在对象前面加上对应的注解,就可以用其对象的服务了。
@Autowired
private RealNameDao realNameDao;

动态代理/spring IOC/JAVA反射机制相关推荐

  1. Java反射机制概念及应用场景

    Java反射机制概念及应用场景 Java的反射机制相信大家在平时的业务开发过程中应该很少使用到,但是在一些基础框架的搭建上应用非常广泛,今天简单的总结学习一下. 1. 什么是反射机制? Java反射机 ...

  2. java反射机制(三)---java的反射和代理实现IOC模式 模拟spring

    IOC(Inverse of Control)可翻译为"控制反转",但大多数人都习惯将它称为"依赖注入".在Spring中,通过IOC可以将实现类.参数信息等配 ...

  3. Java反射机制和动态代理实例

    反射机制是Java语言的一个重要特性,允许用户动态获取类的信息和动态调用对象的方法. 通过给定类的名字,通过反射机制就可以获取类的所有信息. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道 ...

  4. Java 反射机制和动态代理是基于什么原理,了解过吗?

    工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因: 1."知其然不知其所以然". 做了多年技术,开发了 ...

  5. JAVA反射机制、Class类及动态加载、成员变量构造方法其他方法的反射与调用、代理模式AOP

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语言 ...

  6. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  7. 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】...

    方法1:通过get()方法获取属性值 package com.sxd.test.controller;public class FirstCa{private Integer num;private ...

  8. Java 反射机制你还不会?那怎么看 Spring 源码?

    作者 | ewenll 责编 | 夕颜 出品 | CSDN博客 Java代码在计算机中经历的阶段:三个阶段 Person.java经过javac编译,变为Person.class文件(字节码文件),字 ...

  9. java反射机制原理,为什么需要反射,反射的作用

    最近在学java反射以及动态代理,好多博客都写的十分官方.就自己整合些资料.加深java反射机制的理解. 在说反射之前,我们要先了解动态语言和静态语言的概念: 动态类型语言 所谓动态类型语言,就是类型 ...

最新文章

  1. cpc卡内计费信息异常包括_抖音CPC是什么?广告的优势在哪?抖音CPC广告转化率高吗?...
  2. 笔记-高项案例题-2019年下-计算题
  3. 企业环境中UM的规划设计和配置
  4. 35. 搜索插入位置 golang
  5. 【LeetCode】剑指 Offer 04. 二维数组中的查找
  6. 2层框架结构柱子间距_3分钟牢记框架结构要点
  7. lt;转载自刘佳ID:freedom0203和waretgt; C++中成员初始化列表的使用
  8. Windows98 win98.bif 文件
  9. hcia题库app有哪些?HCNA题库和考试内容一模一样吗?
  10. C语言队列单链表实现(通俗易懂),可直接使用
  11. 恢复计算机个性化设置方法,Win7主题默认还原电脑用了主题软件没办法恢复完美解决系统主-win7主题...
  12. 央行数字货币——DCEP的那些事儿
  13. 三毛的老家:4月中旬了还在中雪!
  14. c语言数组及其下标引用,C语言之数组下标引用与间接引用
  15. 信息技术在园林绿化技师试题测试中的应用
  16. 统计学中位数概念的理解
  17. meltdown linux 补丁,谈谈CentOS发布内核安全补丁:修复Meltdown和Spectre漏洞
  18. OPC DA与OPC UA的区别
  19. SpreadJS 表格控件相关基础知识
  20. 数据库连接在哪?数据库连接池

热门文章

  1. 【图解二叉树】如何用中序遍历一棵二叉树?(三种解法)
  2. 协方差(covariance)和相关系数(correlation coefficient)
  3. 7-3 强迫症 (20 分)
  4. 区分 程序(Program) VS 进程(Process)
  5. 蛋花花:程序员入门门槛真的很低吗
  6. NIN(Network in Network)
  7. 电脑专用计算机设备(工控机),工控机能够直接当作电脑来使用吗
  8. 将README.md中的图片替换为github地址的图片
  9. 码农的浪漫(js写的'老婆生日快乐'特效)
  10. 正则表达式中只允许录入汉字和中间点,中间点前后必须有值