个人对于代理的理解:就像现实生活中的明星一样,明星只负责做自己的实际工作,如演戏,唱歌等,然而档期的安排或者是公司的管理都不可能全由明星自己来做,一般都需要一个经纪人,java中的代理就是类似经纪人的角色,经纪人负责帮明星处理一些比较杂的事务,代理对象就帮实际对象处理一下类如事务管理或者是日志处理等类似的事情。
静态代理:
共有接口
package proxy;
//真实对象实现的接口
public interface People {
public void work(String name);
public void eat(String name);
}
真实类
package proxy;
//真实对象的类
public class Worker implements People {
@Override
public void work(String name) {
System.out.println(name+" is working");
}
@Override
public void eat(String name) {
System.out.println(name+"is eating");
}
}
代理类
package proxy;
//真实对象的代理类,包含一个真实对象的属性,且必须和真实对象实现相同的接口
public class WorkerProxy implements People{
private People worker;
//构造器,负责将真实对象注入
public WorkerProxy(People worker)
{
this.worker=worker;
}
@Override
public void work(String name) {
//调用真实对象之前的做的事
System.out.println("做某件事之前");
//调用实际对象的方法
worker.work(name);
//调用真实对象之后做的事
System.out.println("做某件事之后");
}
@Override
public void eat(String name) {
System.out.println("做某件事之前");
worker.eat(name);
System.out.println("做某件事之后");
}
}
测试
package proxy;
public class ProxyClient {
public static void main(String[] args) {
//真实对象
People people = new Worker();
//创建代理对象
WorkerProxy proxy = new WorkerProxy(people);
//调用代理的对象方法,实际也会调用真实对象的方法
proxy.work("Zhang");
}
}
输出结果
做某件事之前
Zhang is working
做某件事之后
以上就是一个关于静态代理的简单demo,那么静态代理有什么优缺点呢?
优点:业务类只需要专注自己最核心的业务,做好自己的事情,而关于事务或者日志处理的琐事就交给代理来完成,这也是代理机制共有的优点
缺点:1.如果代理的方法比较多,那么每个代理方法都要写很多重复的代码,重用性很低
2.一个真实对象对应一个代理类,如果需要被代理的对象很多,就需要更多的代理类,程序会变得复杂
动态代理:
共有接口
package proxy;
//真实对象实现的接口
public interface People {
public void work(String name);
public void eat(String name);
}
真实类
package proxy;
//真实对象的类
public class Worker implements People {
@Override
public void work(String name) {
System.out.println(name+" is working");
}
@Override
public void eat(String name) {
System.out.println(name+"is eating");
}
}
动态代理类
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/*
* 这个类负责生成代理对象,invoke方法负责定制代理方法的具体实现
*/
public class DymticProxy implements InvocationHandler {
private Worker worker;
//负责注入真实对象
public DymticProxy(Worker worker) {
super();
this.worker = worker;
}
@Override
public Object invoke(Object object, Method method, Object[] args) throws Throwable {
System.out.println("刷F4");
//调用真实的对象的方法
method.invoke(worker, args);
System.out.println("刷F4");
return null;
}
}
测试
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
//创建真实对象
Worker worker = new Worker();
//创建能生成动态代理的对象,关联到被代理的真是对象
InvocationHandler handler = new DymticProxy(worker);
//生成代理对象
People people = (People)Proxy.newProxyInstance(People.class.getClassLoader(), worker.getClass().getInterfaces(), handler);
//操作代理对象,实际会调用真<span style="font-family: Arial, Helvetica, sans-serif;">实对象的方法</span>
people.work("ClearLove");
//注意代理对象的类名,由JVM生成的
System.out.println(people.getClass().getName());
}
}
输出
刷F4
ClearLove is working
刷F4
com.sun.proxy.$Proxy0
以上就是关于java动态代理的一个简单demo,动态代理在JAVA中是非常重要的一个机制,像Spring中的aop的底层就是实现的动态代理的机制。