1.Dog.java
package com.proxy;
public interface Dog {
public void info();
public void run();
}
2.DogImpl.java
package com.proxy;
public class DogImpl implements Dog {
public void info() {
System.out.println("我是一只猎狗");
}
public void run() {
System.out.println("我奔跑迅速");
}
}
3.DogIntercepter.java
package com.proxy;
//定义系统拦截器类,用于拦截Dog实例
public class DogIntercepter {
//第一个拦截器方法
public void method1(){
System.out.println("========模拟通用方法1=========");
}
//第二个拦截器方法
public void method2(){
System.out.println("========模拟通用方法2=========");
}
}
4.MyProxyFactory.java
package com.proxy;
import java.lang.reflect.*;
/*
* 系统还需要一个代理工厂,代理工厂的主要作用是根据目标对象生成一个代理对象,
* 实际上这个代理对象里的方法是目标对象的方法和拦截器方法的组合。。。正是通过些
* 实现拦截
*/
public class MyProxyFactory {
public static Object getProxy(Object object){
//代理处理类
ProxyHandler handler=new ProxyHandler();
//把该Dog实例托付给代理操作
handler.setTarget(object);
//第一个参数是用来创建动态代理的ClassLoader对象,只要该对象能访问Dog接口即可
//第二个参数是接口数组,正是代理该接口数组
//第三个参数是代理包含的处理实例。
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), handler);
}
}
5.ProxyHandler.java
package com.proxy;
/*
* 动态调用目标对象的方法
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.*;
public class ProxyHandler implements InvocationHandler {
//需被代理的目标对象
private Object target;
//创建拦截器实例
DogIntercepter di=new DogIntercepter();
//执行代理的目标方法时,该invoke方法会被自动调用
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
//如果被调用的方法是info
if(method.getName().equals("info")){
//调用拦截器方法1
di.method1();
result=method.invoke(target, args);
//调用拦截器方法2
di.method2();
}else{
result=method.invoke(target, args);
}
return result;
}
//用于设置传入目标对象方法
public void setTarget(Object o){
this.target=o;
}
}
6.TestDog.java
package com.proxy;
public class TestDog {
public static void main(String args[]){
Dog targetObject=new DogImpl();
Dog dog=null;
Object proxy=MyProxyFactory.getProxy(targetObject);
if(proxy instanceof Dog){
dog=(Dog)proxy;
}
dog.info();
dog.run();
}
}
分享到:
相关推荐
### Java 动态代理Proxy应用和底层源码分析 #### 一、Java动态代理简介 Java动态代理是一种在运行时动态生成代理类的技术,通过该技术可以为一个或多个接口生成一个实现类,该实现类可以拦截接口方法的调用,并...
JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...
Java中的动态代理是实现AOP的一种方式,特别是对于接口的代理。下面我们将详细探讨如何在Java中实现基于接口的动态代理,以及其背后的原理。 首先,我们需要定义一个接口,这个接口包含了我们真正想实现的业务逻辑...
在Java编程中,动态代理(Dynamic Proxy)是一种强大的设计模式,它允许我们在运行时创建具有特定接口的新对象。Java的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...
动态代理类例子proxy动态代理类例子proxy动态代理类例子proxy
在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...
总结来说,Java动态代理通过`Proxy`和`InvocationHandler`提供了灵活的代码扩展机制,可以在运行时为对象创建代理,实现在不修改原有代码的基础上添加额外功能。这在处理需要拦截和增强的对象时非常有用,例如日志...
本文将深入探讨Java中的动态代理,特别是基于`java.lang.reflect.Proxy`类的使用。 首先,`java.lang.reflect.Proxy`是Java标准库中用于生成动态代理类的关键类。它允许我们创建一个新的接口实现类,而无需手动编写...
AOP 动态代理(Proxy invocationHandler),Spring的动态代理的介绍
此文比较详细讲述了Nginx与proxy共同搭建反向代理服务的配置方法
"ArcGIS JS API跨域配置 Proxy 代理" ArcGIS JS API 跨域配置是指在 JS 开发中遇到的访问本地服务和外网服务的问题,需要使用 Proxy 代理来解决跨域访问文件的问题。ArcGIS 的帮助中已经有了相关的介绍和使用配置。...
Nginx在vhost里的配置站点,通过proxy转发到动态域名的具体配置。 反向代理,动态域名 ,Proxy
《GoProxy-Android:全能代理服务器在安卓平台的应用与实现》 GoProxy-Android是由snail007/goproxy团队开发的一款适用于安卓系统的全能代理服务器应用。此项目旨在为移动设备提供强大的网络代理功能,使得用户能够...
【标题】:“JDBC Proxy 代理类” 在Java开发中,JDBC(Java Database Connectivity)是连接数据库的主要方式。然而,直接使用JDBC代码往往繁琐且易出错,因此引入了代理类(Proxy Class)的概念,它能为JDBC提供更...
简易高效的代理池,提供如下功能: 1. 定时抓取免费代理网站,简易可扩展 2. 使用 Redis 对代理进行存储...Github 链接:https://github.com/Python3WebSpider/ProxyPool 详情阅读:README.md,使用方法及相关信息讲解
在这个“java proxy demo”中,我们将深入探讨如何利用Sun JDK API来创建和使用Java动态代理。 首先,我们要了解Java代理的基本概念。Java代理分为静态代理和动态代理两种。静态代理是在编译时就已经确定代理类的...
这里我们探讨的“spring proxy代理模仿”主要指的是Spring AOP(面向切面编程)中的动态代理实现。Spring AOP通过代理模式为我们提供了在运行时向目标对象添加拦截器或切面的能力,这在进行日志记录、性能监控、事务...
在Java编程语言中,反射(Reflection)和动态代理(Dynamic Proxy)是两个强大的特性,它们为程序员提供了在运行时检查和操作类、接口、对象的能力。这篇内容将深入讲解这两个概念,帮助初学者理解并掌握它们的应用...