动态代理1

动态代理

1. 只学一个方法:

Object proxyObject = Proxy.newProxyInstance(ClassLoader classLoader, Class[] interfaces, InvocationHandler h);

 方法的作用:在运行时,动态创建一组指定的接口的实现类对象!(在运行时,创建实现了指定的一组接口的对象)

interface A {

}

interface B {

}

Object o = 方法(new Class[]{A.class,B.class})

o它实现了A和B两个接口!

?

Object proxyObject = Proxy.newProxyInstance(ClassLoader classLoader, Class[] interfaces, InvocationHandler h);

1. 方法作用:动态创建实现了interfaces数组中所有指定接口的实现类对象!

三大参数介绍:

1. ClassLoader:类加载器!

* 它是用来加载器的,把.class文件加载到内存,形成Class对象!

2. Class[] interfaces:指定要实现的接口们

3. InvocationHandler:被代理的对象的所有方法(个别不执行,getClass())都会调用InvocationHandler的invoke()方法。

说明:也就是说,实现动态代理需要三大参数。

2. 动态代理作用

最终是学习AOP(面向切面编程),它与装饰者模式有点相似,它比装饰者模式还要灵活!

InvocationHandler

public Object invoke(Object proxy, Method method, Object[] args);

?

这个invoke()方法在什么时候被调用!

1. 在代理对象被创建时?错误的!

2. 在调用代理对象所实现接口中的方法时?正确的!

?

* Object proxy:当前对象,即被代理的对象!在调用谁的方法!

* Method method:当前被调用的方法(目标对象的方法)

* Object[] args:实参!

他们之间的对应关系:

目标对象:被增强的对象

代理对象:需要目标对象,然后在目标对象上添加了增强后的对象!

目标方法:增强的内容

代理对象 = 目标对象 + 增强

?

实例:使用 三大参数来创建 代理对象:Dome1.java


/**

* @function
使用三大参数来创建代理对象

* @author not-bug

*

*/

public
class Demo1 {

????@Test

????public
void fun1() {

????????/*

???????? * 三大参数

???????? * 1. ClassLoader

???????? * 方法需要动态生成一个类,这个类实现了A、B接口,然后创建这个类的对象!

???????? * 需要生成一个类,这个类也需要加载到方法区中,谁来加载,当然是ClassLoader!!!

???????? *

???????? * 2. Class[] interfaces

???????? * 它是要实现的接口们,也就是说,你需要实现的接口

???????? *

???????? * 3. InvocationHandler

???????? * 它是调用处理器

???????? * 敷衍它!

???????? *

???????? * 代理对象中实现所有接口中的方法,内容都是调用InvocationHandler的invoke()方法。

???????? */

????????ClassLoader loader = this.getClass().getClassLoader();

????????InvocationHandler h = new InvocationHandler() {

????????????public Object invoke(Object proxy, Method method, Object[] args)

????????????????????throws Throwable {

????????????????System.out.println("你好,动态代理!");

????????????????return
"xxx";

????????????}

????????};

????????// 使用三大参数创建代理对象!!!

????????Object o = Proxy.newProxyInstance(loader, new Class[]{A.class, B.class}, h);

????????

????????// 强转成A和B类型,成功了!

????????A a = (A) o;

????????B b = (B) o;

????????

//????????a.a();

//????????a.aa();

//????????b.b();

//????????b.bb();

????????

//????????System.out.println(o.getClass().getName());

????????//调用被代理对象所实现的接口方法,其实是在调用InvocationHandler的invoke()方法。

????????Object result = a.aaa("hello", 100);

????????System.out.println(result);

????}

}

?

interface A {

????public
void a();

????public
void aa();

????public Object aaa(String s, int
i);

}

?

interface B {

????public
void b();

????public
void bb();

}

?

该实例运行结果:

时间: 2024-10-23 15:51:15

动态代理1的相关文章

Java基础加强——动态代理

代理模式: 为其他对象提供一种代理以控制对这个对象的访问. 代理模式主要分为两类: 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了.  动态代理:在程序运行时,运用反射机制动态创建而成 1.静态代理相对好理解一些,来看下面的代码: 接口 Count.java /** * 账户接口 * @author jiangbei01 * */ public interface Count { void add(); void update();

理解java动态代理

java动态代理是java语言的一项高级特性.在平时的项目开发中,可能很难遇到动态代理的案例.但是动态代理在很多框架中起着不可替代的作用,例如Spring的AOP.今天我们就聊一聊java动态代理的实现原理. jdk对于动态代理的支持主要依赖于两个类:Proxy和InvocationHandler.我们先看一下类图. Subject类是主题类,定义了我要做什么.我们需要代理的类即实现Subject接口的RealSubject. 1.InvocationHandler InvocationHand

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

java动态代理的实现

动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy).那么有没有一种机制能够让系统在运行时动态创建代理类?答案就是本文将要介绍的动态代理(Dynamic Proxy).动态代理是一种较

关于java的一个典型的动态代理

今天看书的一个过程中,看到一个动态代理看下代码 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy { public static void testDynamicProxy(){ Calculator calculator = new CalculatorImpl(); LogH

Java进阶之 JDK动态代理与Cglib动态代理

一.动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式[Proxy Pattern]), 动态代理类的字节码是在程序运行时由Java反射机制动态生成. 注意: 1.AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理 2.Spring AOP采用运行时生成AOP代理类,无需使用特定编译器进行处理,但是性能相对于AspectJ较差 二.JDK动态代理 [对有实现接口的对象做代理] 1.JDK动态代理中 需要了解的

java动态代理和cglib动态代理

动态代理应用广泛,Spring,Struts等框架很多功能是通过动态代理,或者进一步封装来实现的. 常见的动态代理模式实现有Java API提供的动态代理和第三方开源类库CGLIB动态代理. Java API提供的动态代理是基于类反射实现的,用到的类有: java.lang.reflect.InvocationHandler; java.lang.reflect.Method; java.lang.reflect.Proxy; 其实现是通过Proxy类的newProxyInstance()方法产

java的代理和动态代理简单测试

什么叫代理与动态代理? 1.以买火车票多的生活实例说明. 因为天天调bug所以我没有时间去火车票,然后就给火车票代理商打电话订票,然后代理商就去火车站给我买票.就这么理解,需要我做的事情,代理商帮我办了,但是需要出手续费. 废话不说了,直接上java代码吧! java动态代理 //接口   (抽象买票的事情) public interface ICalc {     public int add(int i, int j);}//实现这个接口   (具体到我买票的事情) public class

动态代理连接数据库

package 动态连接数据库; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.DriverManager; import java.util.LinkedList; public class UtilsDB { public static

动态代理模式

动态代理模式简介: 动态代理能够自动监听代理对象的方法,并且能够自动生成代理类的代码,这样就不需要我们自己去重写代理对象里的方法了,这样解决了代理类代码因业务庞大而庞大的问题,因为动态代理模式会在代码运行时根据代码来在内存中动态生成一个代理类自动重写代理对象[学Java,到凯哥学堂kaige123.com]的方法,然后这个动态代理类再调用处理类里的代码,处理类再调用到实际方法上去.而且我们可以选择性的监听代理对象的方法,有些不需监听的方法就可以在处理类中过滤掉.所以动态代理的优势就在于可以自动的