动态代理
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