采用Java代理模式,代理类通过调用委托类对象的方法,来提供特定的服务。委托类需要实现一个业务接口,代理类返回委托类的实例接口对象。
按照代理类的创建时期,可以分为:静态代理和动态代理。
所谓静态代理: 指程序员创建好代理类,编译时直接生成代理类的字节码文件。
所谓动态代理: 在程序运行时,通过反射机制动态生成代理类。
一、静态代理类实例:
1、Serivce.java
- package com.ibm.delegate;
-
-
-
-
-
- public interface Service {
-
-
-
-
- public String queryDate();
-
-
-
- public int sub(int a, int b);
- }
2、ServiceImpl.java
- package com.ibm.delegate;
-
- import java.util.Date;
-
-
-
-
-
- public class CountImpl implements Service {
-
- @Override
- public String queryDate() {
- return new Date().toString();
- }
-
- @Override
- public int sub(int a, int b) {
- return a-b;
- }
-
- public void ownMethod(){
- System.out.println("It's my own method");
- }
- }
3、ServiceProxy.java
- package com.ibm.staticproxy;
-
- import com.ibm.delegate.Serivce;
- import com.ibm.delegate.CountImpl;
-
-
-
-
-
- public class SerivceProxy implements Service {
- private CountImpl countImpl;
-
- public SerivceProxy(CountImpl countImpl){
- this.countImpl = countImpl;
- }
-
- @Override
- public String queryDate() {
- return countImpl.queryDate();
- }
-
- @Override
- public int sub(int a, int b) {
- return countImpl.sub(a, b);
- }
-
- public void ownMethod(){
- System.out.println("It's my own method");
- }
- }
4、ServiceTest.java(测试类)
- package com.ibm;
-
- import com.ibm.delegate.ServiceImpl;
- import com.ibm.staticproxy.ServiceProxy;
-
- public class ServiceTest {
-
-
-
-
- public static void main(String[] args) {
-
- ServiceImpl target = new ServiceImpl();
-
- ServiceProxy proxy = new ServiceProxy(target);
- String date = proxy.queryDate();
- System.out.println(date);
- int result = proxy.sub(10, 20);
- System.out.println("10-20 = "+result);
- proxy.ownMethod();
- }
- }
静态代理类的特点: 代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。而且代理类只能为特定的接口(Service)服务。
动态代理实例:
3、ServiceProxy.java
- package com.ibm.dynamicproxy;
-
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
-
- public class ServiceProxy implements InvocationHandler {
-
- private Object target;
-
- public ServiceProxy(Object target){
- this.target = target;
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- Object result = null;
- result = method.invoke(target, args);
- return result;
- }
-
-
-
-
-
- public Object getProxyInstance(){
- return Proxy.newProxyInstance(target.getClass().getClassLoader(),
- target.getClass().getInterfaces(), this);
- }
- }
4、ServiceTest.java(测试类)
- package com.ibm;
-
- import com.ibm.delegate.Service;
- import com.ibm.delegate.ServiceImpl;
- import com.ibm.dynamicproxy.ServiceProxy;
-
- public class ServiceTest {
-
-
-
-
- public static void main(String[] args) {
-
- ServiceImpl target = new ServiceImpl();
-
- ServiceProxy proxy = new ServiceProxy(target);
- Service service = (Service) proxy.getProxyInstance();
- String date = service.queryDate();
- System.out.println(date);
- int result = service.sub(10, 20);
- System.out.println("10-20 = "+result);
- }
- }
动态代理: 代理类需要实现InvocationHandler接口。
使用场合举例: 如果需要委托类处理某一业务,那么我们就可以先在代理类中,对客户的权限、各类信息先做判断,如果不满足某一特定条件,则将其拦截下来,不让其代理。
修改两个方法,做测试:
ServiceImpl.java
- public String ownMethod(){
- System.out.println("It's my own method");
- return "user";
- }
ServiceProxy.java
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- Object result = null;
- if(!(target instanceof ServiceImpl)){
- System.out.println("不能代理该对象");
- return result;
- }else if(!((ServiceImpl)target).ownMethod().equals("admin")){
- System.out.println("权限不够");
- return result;
- }
- result = method.invoke(target, args);
- return result;
- }
分享到:
相关推荐
java static proxy dynamic proxy
java 代理(动态、静态)实例:该资源包括java的动态代理和静态代理实例,代理里并有详细的注释。
主要介绍了Java动态代理静态代理实例分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
实例201 Servlet生成的动态图片 658 实例202 简单的JSP上传文件 661 实例203 用Servlet获取Web服务器信息 666 实例204 可选择的图形验证码 670 实例205 简单的页面注册 675 实例206 用Servlet实现分页查看...
第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 ...实例290 LAN使用代理服务器 562 实例291 BBS论坛服务器端 567 实例292 ...
单例设计模式案例演示 单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,**应用该模式的这个类只有一个实例**。即一个类只有一个对象实例。 #### 单例设计模式实现步骤 ...动态代理案例演示
实例154 使用静态成员变量计算内存中实例化的对象数目 239 实例155 实现加减乘除的方法 240 8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 ...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
###1.2静态代理代理类在程序运行前已经存在的代理方式成为静态代理。通过上面解释可以知道,由开发人员编写或是编译器生成代理类的方式都属于静态代理。源码中实现了一个静态代理的实例:ClassA 是委托类 , ClassB...
实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对List的排序操作 393 实例219 LinkedList的添加删除操作 395 实例220 运用Vector 397 实例221 改变Properties...
实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对List的排序操作 393 实例219 LinkedList的添加删除操作 395 实例220 运用Vector 397 实例221 改变...
实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 实例165 空指针异常 213 7.4 常见的已检查型异常 214 实例166 类未发现异常 ...
实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对List的排序操作 393 实例219 LinkedList的添加删除操作 395 实例220 运用Vector 397 实例221 改变Properties文件中的...
静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量
Proxy提供了用于创建动态代理类和代理对象的静态方法,他也是所有动态代理类的父类,如果在程序中为一个或多个接口动态的生成实现类,就可以使用Proxy来创建动态代理类,如果需要为一个或多个接口动态的创建实例,也...