目标:学习开发出一个动态代理的对象出来,理解动态代理的执行流程
先创建一个接口Skill.java
package reflect.d8_proxy;
public interface Skill {
void sing(); // 唱
void dance(); // 跳
void rap(); // Rap
}
再创建一个实体类Start.java
package reflect.d8_proxy;
public class Star implements Skill{
private String name;
public Star(String name) {
this.name = name;
}
@Override
public void sing() {
System.out.println(name + "开始唱歌哩!");
}
@Override
public void dance() {
System.out.println(name + "积泥肽酶。。");
}
@Override
public void rap() {
System.out.println(name + "呗呗~~~");
}
}
再设计一个方法来返回对象的代理对象StartAgentProxy.java
package reflect.d8_proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class StarAgentProxy {
/*
设计一个方法来返回一个明星对象的代理对象。
*/
public static Skill getProxy(Star obj){
//为蔡徐坤这个对象生成一个代理对象
/*
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces, 对象实现的接口列表
InvocationHandler h)
参数:
①从obj对象中得到类对象,进而找到类加载器,可在底层加载代理类,最终创建一个代理对象
②先拿对象的类对象(Star),再拿上面的接口(Skill)
③写上代理的核心处理逻辑
*/
//代理也要实现Skill接口,可以转成Skill再返回成为一个代理对象
return (Skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("首款。。。");
// 收到首款后,经纪人让蔡徐坤去干活
// method ==> 正在调用的方法对象; args ==> 代表这个方法的参数
Object rs = method.invoke(obj,args); // 触发
System.out.println("尾款。。。");
// 收到尾款后,经纪人接蔡徐坤回来
return rs;
}
});
}
}
实现类Text.java
package reflect.d8_proxy;
public class Test {
public static void main(String[] args) {
// 1、创建一个对象(蔡徐坤)。对象的类必须实现接口。
Star s= new Star("蔡徐坤");
// s.sing();
// s.dance();
// s.rap();
// 为蔡徐坤对象生成一个代理对象(经纪人)
/*
通过经纪人的类调用方法getProxy(),并把蔡徐坤对象给入。
会返回一个代理对象,代理对象的类型是实现了Skill接口的类型的对象
*/
Skill s2 = StarAgentProxy.getProxy(s);
// 通过对象s2调用方法,通过s2找代理对象
s2.sing(); // 走代理,让代理去管
// s2.dance();
// s2.rap();
}
}
注:文章内容仅供学习使用,如有冒犯,联系删除。