Java动态代理简单入门

个人对于代理的理解:就像现实生活中的明星一样,明星只负责做自己的实际工作,如演戏,唱歌等,然而档期的安排或者是公司的管理都不可能全由明星自己来做,一般都需要一个经纪人,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的底层就是实现的动态代理的机制。

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值