JAVA学习--反射之动态代理模式

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 import java.lang.reflect.Proxy;
 4
 5 //动态代理的使用,体会反射是动态语言的关键
 6 interface Subject {
 7     void action();
 8 }
 9
10 // 被代理类
11 class RealSubject implements Subject {
12     public void action() {
13         System.out.println("我是被代理类,记得要执行我哦!么么~~");
14     }
15 }
16
17 class MyInvocationHandler implements InvocationHandler {
18     Object obj;// 实现了接口的被代理类的对象的声明
19
20     // ①给被代理的对象实例化②返回一个代理类的对象
21     public Object blind(Object obj) {
22         this.obj = obj;
23         return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
24                 .getClass().getInterfaces(), this);
25     }
26     //当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下的invoke方法的调用
27     @Override
28     public Object invoke(Object proxy, Method method, Object[] args)
29             throws Throwable {
30         //method方法的返回值时returnVal
31         Object returnVal = method.invoke(obj, args);
32         return returnVal;
33     }
34
35 }
36
37 public class TestProxy {
38     public static void main(String[] args) {
39
40         //1.被代理类的对象
41         RealSubject real = new RealSubject();
42         //2.创建一个实现了InvacationHandler接口的类的对象
43         MyInvocationHandler handler = new MyInvocationHandler();
44         //3.调用blind()方法,动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象。
45         Object obj = handler.blind(real);
46         Subject sub = (Subject)obj;//此时sub就是代理类的对象
47
48         sub.action();//转到对InvacationHandler接口的实现类的invoke()方法的调用
49
50         //再举一例
51         NikeClothFactory nike = new NikeClothFactory();
52         ClothFactory proxyCloth = (ClothFactory)handler.blind(nike);//proxyCloth即为代理类的对象
53         proxyCloth.productCloth();
54
55
56
57     }
58 }
时间: 2024-10-14 20:12:23

JAVA学习--反射之动态代理模式的相关文章

JAVA学习--反射之静态代理模式

1 //静态代理模式 2 //接口 3 interface ClothFactory{ 4 void productCloth(); 5 } 6 //被代理类 7 class NikeClothFactory implements ClothFactory{ 8 9 @Override 10 public void productCloth() { 11 System.out.println("Nike工厂生产一批衣服"); 12 } 13 } 14 //代理类 15 class Pr

java的反射 和 动态代理

一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 要想解剖一个类,必须先要获取到该类的字节码文件对象.而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象. 反射就是把java类中的各种成分映射成一个个的Java对象 例如:一个类有:成员变量.方法.构造方法.包等等信息,利用反射技

java学习笔记-设计模式9(代理模式)

意图 为其他对象提供一种代理以控制对这个对象的访问. public interface Sourceable { public void method(); } public class Source implements Sourceable{ @Override public void method() { System.out.println("this is original method!"); } } public class Proxy implements Source

Java学习笔记——设计模式之四.代理模式

To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: 1 package cn.no4.proxy; 2 3 public interface IMakeMoney { 4 5 void makeMoney(); 6 } 1 package cn.no4.proxy; 2 3 public class Proxy implements IMakeMoney { 4

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

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

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

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

java 动态代理模式

一.相关类及其方法:java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序(详见api文档) java.lang.reflect.InvocationHandler,InvocationHandler 是代理实例的调用处理程序 实现的接口.invoke()在代理实例上处理方法调用并返回结果.在与方法关联的代理实例上调用方法时,将在调用处理程序

Java静态代理与动态代理模式的实现

前言:    在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总没有时间见面,他也没办法.后来,房东想了一个办法,他找到了一个人代替自己和小王洽谈,房东本人不用出面,他只要把他的对房客的要求告诉他找的那个人,那个人和你商量就可以了,这样就可以完成租房这件事了.这种现实场景比比皆是,所呈现出来的其实就是代理模式的原型的一种.我们把焦点转向编程,你是否在编程中经常遇见这样一个问题,对于访问某个对象,我们希望给它的方法前加入一

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

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