java反射机制应用之动态代理

1.静态代理类和动态代理类区别

静态代理:要求被代理类和代理类同时实现相应的一套接口;通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的

方法的调用。

动态代理:在程序运行时,根据被代理类及其实现的接口,动态的创建一个代理类。当调用代理类的实现的抽象方法时,就发起对被代理类同样方法的调用。

涉及到的技术点:

①提供一个实现了InvocationHandler接口实现类,并重写其invoke()方法

②Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),h);

2.动态代理的优点

它可以在程序运行时动态的为任何想要被代理的类生成代理对象(代理对象中包含了编写的通用代理逻辑),它不用去关心被代理的类到底是怎样的,可以与被代理的类完全脱离关系,从而灵活的运用到不同的应用场景中。

下面通过具体的代码来体现动态代理的好处

第一个是静态代理的代码

package 反射机制;
//静态代理特征是代理类和目标对象的类都是在编译期间确定下来的
//不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来
//程序开发必然产生过多的代理
//接口
interface ClothProduct{
void productCloth();
}

//被代理类
class NikeClothFactory implements ClothProduct{

@Override
public void productCloth() {
System.out.println("nike生产一批衣服");

}

}
//代理类
class ProxyFactory implements ClothProduct{
ClothProduct cf;
//创建代理类的对象时,实际传入一个被代理类的对象
public ProxyFactory(ClothProduct cf) {
this.cf=cf;
}
@Override
public void productCloth() {

System.out.println("代理类开始执行");
cf.productCloth();
}

}
public class JingTaiDaiLi {
public static void main(String[] args) {
NikeClothFactory nc=new NikeClothFactory();
ProxyFactory proxy=new ProxyFactory(nc);
proxy.productCloth();
}
}
//每建立一个被代理类就必须建立一个代理类,则多个被代理类就得写多个代理类太麻烦

下面是动态代理类

package 反射机制;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//动态代理是指客户通过代理类来调用其他对象的方法,
//并且是在程序运行时根据需要动态创建目标类的代理对象

interface Subject{
void action();
}

//被代理类
class RealSubject implements Subject{
public void action()
{
System.out.println("我是被代理类");
}
}

class MyIvocationHandler implements InvocationHandler{
Object obj;//实现了接口的被代理类的对象的声明
//给被代理类的对象实例化,返回一个代理类的对象
public Object blind(Object obj) {
this.obj=obj;

return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this) ;
}
//当通过代理类的对象发起对重写的方法调用时都会转化为对如下的Invoke方法的调用
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
Object obj1=arg1.invoke(obj, arg2);

return obj1;
}
}
public class DongTaiDaiLi {
public static void main(String[] args) {
//被代理类的对象
RealSubject rs=new RealSubject();
//2创建一个实现实现IvocationHandler接口的类的对象
MyIvocationHandler mh=new MyIvocationHandler();
//3调用blind()方法,动态的返回一个同样实现real所在类的接口subject的代理类的对象
Object obj=mh.blind(rs);
Subject sub=(Subject)obj;//此时sub就是代理类对象
sub.action();//转到IvocationHandler接口的实现类的invoke()方法的调用
System.out.println();
//利用静态代理的被代理类体现动态代理
NikeClothFactory Nick=new NikeClothFactory();
//ClothProduct cp=new ClothProduct();
ClothProduct cp=(ClothProduct)mh.blind(Nick);
cp.productCloth();
}
}

所有被代理类都对应一个代理类,当通过代理类的对象发起对重写的方法调用时都会转化为对唯一一个代理类的Invoke方法的调用,不同的被代理类对应不同的method,所以invoke方法是动态变化的,,方便对多个被代理类的代理。。

原文地址:https://www.cnblogs.com/henuliulei/p/9324391.html

时间: 2024-08-29 12:03:36

java反射机制应用之动态代理的相关文章

java反射机制中的动态代理

java反射机制中的动态代理 动态代理模式及其使用 步骤1:定义一个接口 //接口 interface Subject{ void action(); } 步骤2:定义一个接口的实现类,也就是被代理类 //被代理类 class RealSubject implements Subject { @Override public void action() { System.out.println("我是被代理类,请执行我"); } } 步骤3:定义一个实现InvocationHandle

java 反射之静态and动态代理

首先说一下我们什么情况下使用代理? (1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强. (2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 .那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻

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

作者:54dabang 在spring的学习过程之中,我们可以看出通过配置文件来动态管理bean对象的好处(松耦合 可以让零散部分组成一个整体,而这些整体并不在意之间彼此的细节,从而达到了真正的物理上的疏散耦合,而非逻辑,有了IOC之后,我们可以让SPRING充当各框架中的整合器,把技术框架进行完美的结合). Spring实现的一个重要的机制是通过反射(java.lang.reflect)读取配置文件,通过配置文件来动态生成配置文件中的类对象.Java动态加载类主要是为了不改变主程序代码,通过修

java反射机制与动态代理

在学习HadoopRPC时,用到了函数调用,函数调用都是采用的java的反射机制和动态代理来实现的,所以现在回顾下java的反射和动态代理的相关知识. 一.反射 JAVA反射机制定义: JAVA反射机制是java程序在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射就是把Java类中的各种成分映射成相应的Java类. Java反射机制主要提供了以下功能: 1

Java反射机制剖析(三)-简单谈谈动态代理

通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1.     代理模式 代理模式就是为其他对象提供一种代理来控制对这个对象的访问.其实代理模式是在访问的对象时引入一定程度的间接性,这种间接性可以附加多种用途. 它 的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会 存在关联关系,一个代理类的对象与一个委托类的对象

Java反射机制剖析(四)-深度剖析动态代理原理及总结

动态代理类原理(示例代码参见java反射机制剖析(三)) a)  理解上面的动态代理示例流程 a)  理解上面的动态代理示例流程 b)  代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Proxy0)的源代码和整个动态代理的流程. $Proxy0生成的代码如下: import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; impo

简谈Java 反射机制,动态代理

谈谈 Java 反射机制,动态代理是基于什么原理?小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:701136382 这是小编创建的java高阶学习交流群,加群一起交流学习深造.群里也有小编整理的2019年最新最全的java高阶学习资料! 反射机制 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力.可以在运行时通过提供完整的"包名+类名.class"得到某个对象的类型. 功能 在运行时能判断任意一个对象所属的

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

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

Java反射机制可以动态修改实例中final修饰的成员变量吗?

问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. 2. 当final修饰的成员变量在定义的时候并没有初始化值的话,那么就还能通过java反射机制来动态修改它的值. 实验: 1. 当final修饰的成员变量在定义的时候就初始化了值 1 public Class Person { 2 private final String name = "damon