Java之动态代理

动态代理

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

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

ClassLoader :类加载器,他是用来把.class文件加载到内存,形成class对象
Class[] interfaces :指定要实现的接口们
InvocationHandler: 代理对象的所有的方法都会(个别不会调用)调用invocationHandler的invoke方法

2.动态代理的作用
最终学习Aop(面向切面编程),他与装饰者模式有点相似,但他比装饰者模式更灵活

InvocationHandler的invoke方法,最终修改该方法实现动态代理

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

这个invoke在调用代理对象所实现接口时才调用!

Object proxy: 当前对象,即代理对象。
*>Method method: 当前被调用的方法
*>Object[] args : 实参

动态代理的代码实现

相关代码实现




package com.llb.demo01;

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

import org.junit.Test;

/**
 * 动态代理
 * @author dell
 *
 */
public class Demo01 {

	@Test
	public void fun1() {
		
		/*
		 * 三大参数
		 * 1.classLoader: 方法需要动态生成一个类,这个类实现了A接口和B接口,然后创建这个类的对象。这个类需要加载到方法区中
		 * 2.Class[] interface 
		 *  实现所需要实现的接口
		 * 3.InvocationHandler
		 *  他调用处理器
		 *  实现他的invoke方法
		 */
		//代理对象的实现的所有接口中的方法,内容都是调用InvocationHandler 的invoke方法
		ClassLoader classLoader = this.getClass().getClassLoader();
		InvocationHandler h = new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				System.out.println("你好,动态代理!");
				return "nihao ";
			}
		};
		//使用三大参数创建代理对象
		Object o = Proxy.newProxyInstance(classLoader, new Class[]{A.class,B.class}, h);
		
		//强转成A和B类型成功!
		A a = (A)o;
		B b = (B)o;
		
//		a.a();
//		b.b();
//		o.equals(null);
		String s = a.aaa("你好", 111);
		System.out.println(s);
		
	}
	
}

interface A {
	public void a() ;
	public String aaa(String s, int i);
}

interface B {
	public void b() ;
}

作者为一名大三学生,此文档为平常视频学习所写文档,用来平常复习分享。如有重复,纯属巧合。联系作者邮箱:898877041@qq.com

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值