1.动态代理就是在不改变原来类的方法的情况下,利用代理增加方法的内容。
2.举例
(1)创建接口
package com.jiang.peoxy;
public interface Person {
public void test();
}
(2)创捷实现该接口的类
package com.jiang.peoxy;
public class Student implements Person {
@Override
public void test() {
System.out.println("学生实现了人类接口,现在在执行的是对人类接口test方法的实现");
}
}
(3)此时,我想增加Studnet里面test方法的内容又不想修改Student,就使用代理
(4)代理过程
package com.jiang.peoxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
//1.拿到被代理类的ClassLoader对象
Student student = new Student();
ClassLoader classLoader = student.getClass().getClassLoader();
//2.拿到被代理类的上级接口
Class<?>[] interfaces = student.getClass().getInterfaces();
//3.开始创建代理
//第三个参数是个接口,可以单独拿出来实现,也可以做成内部类
//注意返回的类是被代理类的上级接口
Person p_p=(Person) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在这里写上增加的方法
System.out.println("现在Student的Test方法被我增加了");
//下面就是固定格式了(注意第一个参数要填被代理类)
return method.invoke(student,args);
}
});
//现在测试一下
p_p.test();
}
}
5.代理结果
现在Student的Test方法被我增加了
学生实现了人类接口,现在在执行的是对人类接口test方法的实现
6.一定要注意,代理返回的类只能是被代理类的上级接口