Java反射和动态代理

反射

通过反射的方式Class.forName(“com.ahu.Person”)可以获取class对象的实例以及其中的属性、方法、构造函数等

动态代理

动态代理:在不修改原业务的基础上,基于原业务方法,进行重新的扩展,实现新的业务

例子:

1、 旧业务

买家调用action,购买衣服,衣服在数据库的标价为50元,购买流程就是简单的调用。

2、 新业务

在原先的价格上可以使用优惠券,但是这个功能在以前没有实现过,我们通过代理类,代理了原先的接口方法,在这个方法的基础上,修改了返回值。

代理实现流程:

1、 书写代理类和代理方法,在代理方法中实现代理Proxy.newProxyInstance

2、 代理中需要的参数分别为:被代理的类的类加载器soneObjectclass.getClassLoader(),被代理类的所有实现接口new Class[] { Interface.class },句柄方法new InvocationHandler()

3、 在句柄方法中复写invoke方法,invoke方法的输入有3个参数Object proxy(代理类对象), Method method(被代理类的方法),Object[] args(被代理类方法的传入参数),在这个方法中,我们可以定制化的开发新的业务。

4、 获取代理类,强转成被代理的接口

5、 最后,我们可以像没被代理一样,调用接口的认可方法,方法被调用后,方法名和参数列表将被传入代理类的invoke方法中,进行新业务的逻辑流程。

原业务接口IBoss

1 /**
2  * 这是一个业务的接口,这个接口中的业务就是返回衣服的价格
3  * 4  *
5  */
6 public interface IBoss {//接口
7     int yifu(String size);
8 }

原业务实现类Boss

 1 /**
 2  * 实现了卖衣服的接口
 3  * 自定义了自己的业务,卖裤子
 4  * @author wilson
 5  *
 6  */
 7 public class Boss implements IBoss{
 8     public int yifu(String size){
 9         System.err.println("天猫小强旗舰店,老板给客户发快递----衣服型号:"+size);
10         //这件衣服的价钱,从数据库读取
11         return 50;
12     }
13     public void kuzi(){
14         System.err.println("天猫小强旗舰店,老板给客户发快递----裤子");
15     }
16 }

原业务调用

 1 public class SaleAction {
 2     /**
 3      * 不使用代理,直接调用方法
 4      * 方法中规定什么业务,就只能调用什么业务,规定什么返回值,就只能输出什么返回值
 5      */
 6     @Test
 7     public void saleByBossSelf() throws Exception {
 8         IBoss boss = new Boss();
 9         System.out.println("老板自营!");
10         int money = boss.yifu("xxl");// 老板自己卖衣服,不需要客服,结果就是没有聊天记录
11         System.out.println("衣服成交价:" + money);
12     }
13 }

代理类

 1 public class ProxyBoss {
 2     /**
 3      * 对接口方法进行代理
 4      */
 5     @SuppressWarnings("unchecked")
 6     public static <T> T getProxy(final int discountCoupon,
 7             final Class<?> interfaceClass, final Class<?> implementsClass)
 8             throws Exception {
 9         return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(),
10                 new Class[] { interfaceClass }, new InvocationHandler() {
11                     public Object invoke(Object proxy, Method method,
12                             Object[] args) throws Throwable {
13                         Integer returnValue = (Integer) method.invoke(
14                                 implementsClass.newInstance(), args);// 调用原始对象以后返回的值
15                         return returnValue - discountCoupon;
16                     }
17                 });
18     }
19 }

新业务调用

 1 /**
 2  * 什么是动态代理? 简单的写一个模板接口,剩下的个性化工作,好给动态代理来完成!
 3  */
 4 public class ProxySaleAction {
 5
 6     /**
 7      *使用代理,在这个代理中,只代理了Boss的yifu方法
 8      *定制化业务,可以改变原接口的参数、返回值等
 9      */
10     @Test
11     public void saleByProxy() throws Exception {
12         IBoss boss = ProxyBoss.getProxy(10,IBoss.class,Boss.class);// 将代理的方法实例化成接口
13         //IBoss boss = new Boss();// 将代理的方法实例化成接口
14         System.out.println("代理经营!");
15         int money = boss.yifu("xxl");// 调用接口的方法,实际上调用方式没有变
16         System.out.println("衣服成交价:" + money);
17     }
18 }
时间: 2024-09-29 10:09:07

Java反射和动态代理的相关文章

java反射与动态代理

Java反射与动态代理 Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制.java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性.这些都是java的基础知识,要想成为一名合格的程序猿,必须掌握! Java反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为

Java反射以及动态代理(上)

在常用的各种框架中,反射与动态代理很常见,也很重要.本篇就对这一小节的内容基础性地总结. 首先需要了解什么是类型信息,以及RTTI与反射的关系与区别. Java中,使用Class对象来表示所有类的对象.利用Class对象来获取类中的成员变量,构造函数以及方法,这些内容我们称之为类型信息.RTTI的含义是,在运行时识别一个对象的类型,但有一个前提,就是类型在编译时必须已知,这样才能用RTTI识别,并利用这些信息做一些有用的事情.但是如果在编译时,程序没有办法获知到这个对象所属的类,怎样才能使用这个

java反射实现动态代理

参考:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html http://my.oschina.net/lyp3314/blog/136589 反射可以通过class来创建对象或者修改对象.这样就提供了一个操作对象的方法. 下面拷贝前辈的总结: <反射机制> 为了更好的理解java的反射机制,最好先对java的泛型有所了解.java泛型就是参数化类型,即为所操作的数据类型指定一个参数.如果只指定了<?>,

Java反射以及动态代理(下)-- 源码

承接上篇,本篇就主要介绍动态代理的实现机制. 首先说说怎么去实现一个动态代理.还是可以用一个接口,两种实现来概括,但是代理中的实现并不明显,后面详细看看源码. 接口: package com.changjiang.test.RFP01.testProxy; public interface DynamicInterface { public void testNoArgs(); public String testOneArgs(String name); } 原始实现类: package co

java反射与动态代理的理解

一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制. 讲的通俗一点的话就是,对于jvm来说,.java文件必须要先编译为.class文件才能够被jvm执行,所以在编译为.class文件的过程中,对象的类型都会被指定好,比如说 User user.那么如果说我想在代码运行的过程中获取到对象的类型呢?或者说程序在运行过程

Java反射机制动态代理

package com.kaige123;/** * 程序员 * @author 凯哥 */public interface Chengxuyuan {    /**     * 写代码方法     */    public void xiedaima(); } package com.kaige123;/** * 程序员接口实现类 * @author 凯哥 */public class ChengxuyuanImpl implements Chengxuyuan {    public voi

黑马程序员————java中类的加载、反射、动态代理、枚举

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 类的加载.反射.动态代理.枚举 一.类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.加载: 就是指将class文件读入内存,并为之创建一个Class对象 ★★

Java开发人员必懂的基础——反射与动态代理

Java的反射与动态代理是java体系结构中较为底层的知识,初学者可能觉得没有太大的用处,但他们确实著名Spring框架IOC和AOP所用的最重要的内容.当我们需要开发更基础,更广泛的的代码时,就会用到这学知识了. 在此之前,我们先来了解一下java的类加载机制 JVM与类加载机制: /* * 1.JVM:当调用java命令来运行某个java程序时,该命令会启动一个java虚拟机进程,同一个JVM中的所有线程,所有变量都处于同一个进程里,都使用该JVM的内存区 * 2.JVM:运行下面两个测试类

java中的动态代理机制

在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的.下面通过代码来学习java中的动态代理技术. 首先定义一个接口: package com.aop.spring; /** * Created by xinfengyao on 16-2-29. */ public interface Perform { public void play(); } 实