java中的代理是什么呢?
比如说我们用到一个类A ,我们往常的方法就是直接使用这个类A ,这样在大型的软件开发中有很大的局限性、 。 我们对于使用的类A的修改只能通过对源文件硬编码的修改,
代理就很好的突破了这个瓶颈。
在代理中我们可以定义一个类B,这个类B有个特点 就是和类A有着实现同样的接口 ,我们在类B中间接的调用了 类A, 我们也可以向这个代理的类插入一些通告消息类 。
着在开发框架中经常用到 。
在JAVA中用于动态生成代理类的类 就是 java.lang.reflect.Proxy 这个类 具体的使用 可以去 看看有关于JDK的文档 。
在AOP的程序设计中,InvocationHandler 这个类是作为代理类对于target类的间接调用者 ,所有的被代理类都是通过 这个InvocationHandler这个类来进行调用的 。
我们在对这些步骤进行操作的时候 只需要把实现过程封装起来 把 需要代理的类 作为Object传递进去 那么就可以实现 代理的通用化 ,于是一个小java框架就产生了 。
在使用的过程用 涉及到匿名内部类 ,这里提到 在匿名内部类中调用外部的对象 需要 吧外面的对象 声明为 final 。。。。 这是java的语法 为了是保证数据的安全性。。
StirngBuffer是一个线程安全的类,继承了String在多线程中用到 。
如果只涉及到 单线程那么 就用 StringBuilder这个类 效率会提高很多。。
关于代理的结构图如下:
下面我写一个例子来实现动态代理 :
package me.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
import java.lang.reflect.TypeVariable;
public class MyProxy
{
public static void main(String []args) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException
{
Class clazzProxy=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class) ;//利用Proxy类产生一份代理类的字节码
//Create a Dynamic Class by using Proxy
Constructor constructors[]=clazzProxy.getConstructors() ; //获得代理类的构造方法数组 反射原理
Method []methods=clazzProxy.getMethods() ; //获得代理类的方法
System.out.println("Constructor List:");
for(Constructor con:constructors)
{
String cons=con.getName() ;
StringBuilder conBuilder=new StringBuilder(cons) ;
Class []types = con.getParameterTypes() ;
conBuilder.append('(') ;
if(types.length!=0&&types!=null)
{
for(Class type:types)
{
conBuilder.append(type.getName()) ;
conBuilder.append(',') ;
}
conBuilder.deleteCharAt(conBuilder.lastIndexOf(",")) ;
}
conBuilder.append(')') ;
System.out.println(conBuilder);
}
System.out.println("Methoid list:");
for(Method med:methods)
{
String cons=med.getName() ;
StringBuilder conBuilder=new StringBuilder(cons) ;
Class []types = med.getParameterTypes() ;
conBuilder.append('(') ;
if(types.length!=0&&types!=null)
{
for(Class type:types)
{
conBuilder.append(type.getName()) ;
conBuilder.append(',') ;
}
conBuilder.deleteCharAt(conBuilder.lastIndexOf(",")) ;
}
conBuilder.append(')') ;
System.out.println(conBuilder);
}
/////////////////////////////////////////////////////////////这里是代理类的实现部分
class MyInvocationHandler implements InvocationHandler
{
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return null;
}
}
Collection cn1=(Collection)constructors[0].newInstance((new MyInvocationHandler())) ; //生成一个代理类的对象 这个对象实现了 Collection接口
System.out.println(cn1.toString());
/*************************************************************************************/
Collection cn2=(Collection)constructors[0].newInstance(new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return null;
}
}) ;
/***************************************************************************************/
final ArrayList list=new ArrayList() ;
Advice adv=new MyAdvice() ; //通告类 对象
Collection cn3 = getProxy(list, adv);
cn3.add("xiaowei") ; //会调用 对于代理类的操作会调用InvocationHandler的invoke方法 进行调用目标类 ,调用方法如同反射 机制
cn3.add("man") ;
cn3.add("软件技术") ;
System.out.println("包含"+cn3.size()+"个元素!") ;
for(Object obj:cn3)
{
System.out.println(obj.toString());
}
}
private static Collection getProxy(final Object list ,final Advice advice) {
Collection cn3=(Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),
new Class[]{Collection.class},
new InvocationHandler()
/*@Override
public Object invoke(Object proxy, Method method, Object[] args) //代理类在执行每一个被代理类的方法的时候 就会调用这个invoke方法 并且传递Method对象 我们就可以动态的调用目的类的方法
throws Throwable {
//ArrayList list=new ArrayList() ; //必须作为一个成员来实现 否则 每次进行插入操纵那么调用的都是一个新的对象
Long beginTime=System.currentTimeMillis() ;
Object returnVal= method.invoke(list, args); //Invoke the Method
Long endTime=System.currentTimeMillis() ;
System.out.println("Runtime="+(endTime-beginTime));
return returnVal;
}*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//ArrayList list=new ArrayList() ; //必须作为一个成员来实现 否则 每次进行插入操纵那么调用的都是一个新的对象
advice.beginRun(method) ; //内部类调用外部的对象的时候 需要使用 final声明
Object returnVal= method.invoke(list, args); //Invoke the Method 执行代理传递过来的执行方法
advice.afterRun(method) ;
return returnVal;
}
}
);
return cn3;
}
}
//////////////////////////////////////////////////////////////////////////通告接口 和实现类
package me.test;
import java.lang.reflect.Method;
public interface Advice
{
public void beginRun(Method method) ;
public void afterRun(Method method) ;
}
package me.test;
import java.lang.reflect.Method;
public class MyAdvice implements Advice{
long beginTime ;
@Override
public void beginRun(Method method ) {
beginTime=System.currentTimeMillis() ;
}
@Override
public void afterRun(Method method) {
long endTime=System.currentTimeMillis() ;
System.out.println(method.getName()+"运行了"+(endTime-beginTime)+"ms!");
}
}
分享到:
相关推荐
为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...
AOP是面向切面编程,目前比较成熟的编程方式,此文件使用myeclipse写的
本文详细介绍了Java编程中使用动态代理实现AOP功能,AOP是OOP的延续,意思是面向切面编程。 从这篇文章可以大体理解spring AOP的原理。
Spring AOP(面向切面编程)作为Spring框架的一个重要部分,为Java开发者提供了一个强大而灵活的工具来切入代码执行流程,实现关注点的分离。通过详细解析Spring AOP的源码,本文揭示了其背后的核心原理和实现机制。...
针对OOP编程思想的一种补充,AOP编程思想通过分离出与系统核心业务实现无关的模块,减少模块 问的耦合度从而提高开发效率。AOP使得需要编写的代码量大大缩减,节省了时间,控制了开发成本。为使用AOP技 术解决在软件...
Spring AOP(面向切面编程)是Java高级编程中的重要组成部分,它允许程序员以声明的方式处理关注点(例如日志、事务管理等),而不是通过硬编码。本文深入分析了Spring AOP的实现机制,让读者能够更好地理解和应用这...
对应的博客链接:http://blog.csdn.net/JQ_AK47/article/details/60469034#t12
jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口,则没办法代理这个类。 cglib代理, 1.cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在...
package com.gc.dynproxy下为:aop方式动态代理 package com.gc.javaproxy下为:java代理机制实现 package com.gc.proxy下为:自定义代理模式(面向接口编程) package com.gc.normal下为:通用日志处理方式
为了简单起见,例子没有没有使用任何第三方的AOP Framework, 而是利用Java语言本身自带的动态代理功能来实现AOP. 让我们先回到AOP本身,AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。它的主要...
java 动态代理实现,模拟了spring实现aop的原理,对学习面向切面编程的朋友有帮助!
自己实现java动态代理、自动注入、切面编程(类似于Spring IOC、AOP)
NULL 博文链接:https://cdxs2.iteye.com/blog/1942254
动态代理在 Java 中有着广泛的应用,比如 AOP 的实现原理、RPC远程调用、Java 注解对象获取、日志框架、全局性异常处理、事务处理等。 在了解动态代理前,我们需要先了解一下什么是代理模式。 代理模式 代理模式...
Spring AOP 使用纯 Java 实现,不需要专门的编译过程和类加载器,在运行期间通过代理方式向目标类植入增强的代码。 课程内容非常详细的介绍Spring AOP全栈技术点,开篇帮助同学们进行知识储备,夯实基础就是核心!...
这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好地理解和利用Spring AOP来提高您的应用程序的可维护性和可扩展性。 内容亮点: JDK动态...
springAOP指的是在spring中的AOP,什么是AOP,相对于java中的面向对象(oop),在面向对象中一些公共的行为,像日志记录,权限验证等如果都使用面向对象来做,会在每个业务方法中都写上重复的代码,造成代码的冗余。...
1.jdk动态代理:使用jdk中的Proxy,Method,InvocaitonHanderl创建代理对象,jdk动态代理要求目标类必须实现接口 2.cglib动态代理:第三方的工具库,创建代理对象,原理是继承。 通过继承目标类,创建子类,子类就是...
写了SpringAop的两种代理的实现,jdk动态代理和cglib代理的代码,及测试。
1、资源内容: Api万能路由利用AOP编程思想,指针参数,等来实现任意object-c的API调用。 支持基本数据类型,对象类型,代理,block,枚举,结构体等(系统自带和自定义均支持) ;本sdk用于组件化开发模式,多sdk...