1.接口定义
public interface PersonDo {
public abstract String sing(String name);
public abstract void dance();
}
2.被代理对象的类
public class Student implements PersonDo{
private String name;
public Student(){
}
public Student(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String sing(String song){
System.out.println(this.name+"歌名为"+song);
return "致谢!";
}
public void dance(){
System.out.println(this.name+"正在跳舞");
}
}
3.创建代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 在该类中来创建一个代理
* */
public class ProxyUtil {
/**
* 形参:被代理的对象
* 返回值:创建的代理
* */
public static PersonDo createProxy(Student student){
/**
* 参数1:用于指定哪个类加载器,去加载生成的代理类
* 参数2:指定接口
* 参数3:用于指定代理对象干什么事情。
* */
PersonDo personDo=(PersonDo) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), /**参数1:用于指定哪个类加载器,去加载生成的代理类*/
new Class[]{PersonDo.class},/**参数2:指定接口,注意:需要将接口的字节码放到数组中*/
/**参数3:生成的代理应当干什莫事情,用于指定代理对象干什么事情。*/
new InvocationHandler() {
/**
* 参数一:代理的对象
* 参数二:要运行的方法
* 参数三:调用sing方法,传递的实参
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//1.前置准备工作
if("sing".equals(method.getName())){
System.out.println("准备话筒和场地工作!");
} else if ("dance".equals(method.getName())) {
System.out.println("准备场地工作!");
}
/**2.调用唱歌或跳舞的方法*/
return method.invoke(student,args);
}
});
return personDo;
}
}
简单来说,就是代理类应当和被代理类实现同一个接口,然后,红框里面的东西很重要,应当理解。
4.测试类
public class Test {
public static void main(String[] args){
/**
* 1.获取代理的对象
*/
Student student1=new Student("张三");
PersonDo proxy=ProxyUtil.createProxy(student1);
/**
* 2.代理调用唱歌或跳舞的其他方法
* */
String result=proxy.sing("青花瓷");
System.out.println(result);
}
}
运行结果: