Java的动态代理模式之JDK代理详解

 更新时间:2023年11月28日 08:44:06   作者:四叶草  
这篇文章主要介绍了Java的动态代理模式之JDK代理详解,代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理,JDK 实现代理只需要使用 newProxyInstance 方法,但是该方法需要接收三个参数,需要的朋友可以参考下

1.动态代理模式的基本介绍

  1. 代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理
  2. 代理对象的生成,是利用 JDK 的 API,动态的在内存中构建代理对象
  3. 动态代理也叫做:JDK 代理、接口代理

2. JDK 中生成代理对象的 API

  1. 代理类所在包:java.lang.reflect.Proxy
  2. JDK 实现代理只需要使用 newProxyInstance 方法,但是该方法需要接收三个参数,完整的写法是:static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )

3.动态代理应用实例

3.1具体要求

  1. 定义一个接口:ITeacherDao
  2. 目标对象 TeacherDAO 实现接口 ITeacherDAO
  3. JDK代理模式,实现动态代理

3.2代码实现

package com.atguigu.proxy.dynamic;
public class Client {
public static void main(String[] args) {
    
	//创建目标对象
	ITeacherDao target = new TeacherDao();
    
	//给目标对象,创建代理对象, 可以转成 ITeacherDao
    ITeacherDao proxyInstance = (ITeacherDao)newProxyFactory(target).getProxyInstance();
    
	// proxyInstance=class com.sun.proxy.$Proxy0 内存中动态生成了代理对象
	System.out.println("proxyInstance=" + proxyInstance.getClass());
    
	//通过代理对象,调用目标对象的方法
	//proxyInstance.teach();
	proxyInstance.sayHello(" tom ");
	}
}
//接口
public interface ITeacherDao {
    
    void teach(); // 授课方法
    
	void sayHello(String name);
}

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

public class ProxyFactory {
    
	//维护一个目标对象 , Object
	private Object target;
    
	//构造器 , 对 target 进行初始化
	public ProxyFactory(Object target) {
		this.target = target;
	}
    
//给目标对象 生成一个代理对象
public Object getProxyInstance() {
//说明
/*
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
//1. ClassLoader loader : 指定当前目标对象使用的类加载器, 获取加载器的方法固定
//2. Class<?>[] interfaces: 目标对象实现的接口类型,使用泛型方法确认类型
//3. InvocationHandler h : 事情处理,执行目标对象的方法时,会触发事情处理器方法, 会把当前执行的目标对象方法作为参数传入
*/
    return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),
			new InvocationHandler() {
		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			System.out.println("JDK 代理开始~~");
			//反射机制调用目标对象的方法
			Object returnVal = method.invoke(target, args);
			System.out.println("JDK 代理提交");
			return returnVal;
			}
		});
	}
}
public class TeacherDao implements ITeacherDao {
	@Override
	public void teach() {
   	 System.out.println(" 老师授课中.... ");
	}
    
	@Override
	public void sayHello(String name) {
        
	System.out.println("hello " + name);
        
	}
}

到此这篇关于Java的动态代理模式之JDK代理详解的文章就介绍到这了,更多相关JDK代理详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java编程中正则表达式的用法总结

    Java编程中正则表达式的用法总结

    这篇文章主要介绍了Java编程中正则表达式的用法总结,正则表达式是一种强大的字符串处理工具,Java对正则表达式的支持还是很不错的,我们先来整理一下正则表达式的一些基础知识:
    2016-05-05
  • java实现验证码类生成中文验证码

    java实现验证码类生成中文验证码

    java实现的汉字输入验证码,主要包含两个类,一个是生成验证码,一个是判断验证码输入是否正确,实现原理非常简单,将汉字和干扰线生成图片并将汉字保存到session,前台获取每次生成验证码图片并用文本框值和session值比较,功能就怎么简单
    2014-01-01
  • mybatis中string和date的转换方式

    mybatis中string和date的转换方式

    这篇文章主要介绍了mybatis中string和date的转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java设计模式之java中介者模式详解

    Java设计模式之java中介者模式详解

    这篇文章主要为大家详细介绍了23种设计模式之java中介者模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-09-09
  • Spring Cloud Hystrix线程池不足的解决方法

    Spring Cloud Hystrix线程池不足的解决方法

    这篇文章主要介绍了Spring Cloud Hystrix线程池不足的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • intellij idea创建第一个动态web项目的步骤方法

    intellij idea创建第一个动态web项目的步骤方法

    这篇文章主要介绍了intellij idea创建第一个动态web项目的步骤方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Springboot全局异常捕获及try catch区别解析

    Springboot全局异常捕获及try catch区别解析

    这篇文章主要介绍了Springboot全局异常捕获及try catch区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • java排序算法图文详解

    java排序算法图文详解

    这篇文章主要为大家详细介绍了Java经典排序算法之归并排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望可以对你有所帮助
    2021-07-07
  • Java创建多线程的两种方式对比

    Java创建多线程的两种方式对比

    在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口。那么这两种方式孰优孰劣呢?这就是本文需要探讨的内容范畴了,看官们请仔细向下看
    2014-10-10
  • 使用SpringCache操作Redis缓存数据的示例代码

    使用SpringCache操作Redis缓存数据的示例代码

    SpringCache是一个框架,实现了基于注解的缓存功能,只需要简单的加一个注解,就能实现缓存功能,本文给大家介绍了如何使用SpringCache操作Redis缓存数据,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-01-01

最新评论