动态代理工具类

我刚刚想着每次写动态代理的时候都会写非常多的代码,有点不值得,所以我写了一个实现动态代理的工具类。用户能够用JDK动态代理也能够使用CGLIB动态代理,我的ProxyUtils中提供了三种开发动态代理的方式。在实际用的过程中,能够继承Intercepter这个抽象类实如今逻辑代码前后加入控制代码。假设控制代码返回true那么证明能够通过,假设控制代码返回false说明验证不通过,假设不通过那么就返回你逻辑代码中返回的“0”值,假设你逻辑代码返回对象。那么会返回null,假设是其它类型则返回各种类型的零值,用的时候能够实现Intercepter类,也能够用匿名内部类,随你喜欢,以下是我的代码,一段代码代表一个文件,过后我会将代码再好好,封装然后打成一个jar包:

package com.utils.AOPInteface;

public enum AOPMethod {
   JDKAOP,CGLIBAOP
}
package com.utils.AOPInteface;

public interface CheckCode {
    boolean intercepterBefore();
    boolean intercepterAfter();
}
package com.utils.AOPInteface;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

abstract class Intercepter implements CheckCode,InvocationHandler,MethodInterceptor{
    private Object obj;
	public Intercepter(Object obj){
		this.obj=obj;
	}
	final public Object getTarget(){
		return obj;
	}
	@Override
	final public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		Object o=null;
		boolean bef=intercepterBefore();
		if(bef){
			o=method.invoke(obj, args);
		}else{
			return null;
		}
		boolean aft=intercepterAfter();
		if(aft){
			return o;
		}else{
			return null;
		}

	}

	@Override
	final public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		return intercept(proxy, method, args, null);
	}

}
package com.utils.AOPInteface;

import java.lang.reflect.Proxy;

import net.sf.cglib.proxy.Enhancer;

public class ProxyUtils {
	public static Object getJDKProxy(Intercepter intercepter){
		if(intercepter.getTarget().getClass().getInterfaces().length==0){
			return getCGLIBProxy(intercepter);
		}
		return Proxy.newProxyInstance(intercepter.getTarget().getClass().getClassLoader(), intercepter.getTarget().getClass().getInterfaces(), intercepter);
	}

	public static Object getCGLIBProxy(Intercepter intercepter){
		Enhancer enhancer=new Enhancer();
		enhancer.setSuperclass(intercepter.getTarget().getClass());
		enhancer.setCallback(intercepter);
		return enhancer.create();
	}
    public static Object getProxy(AOPMethod amethod,Intercepter intercepter){
    	if(amethod==AOPMethod.JDKAOP){
    		return getJDKProxy(intercepter);
    	}else{
    		return getCGLIBProxy(intercepter);
    	}
    }
    static class Print{
    	public int print(){
    	System.out.println("Hello AOP!!!");
    	return 20;
    	}
    }

}
时间: 2024-10-22 14:12:50

动态代理工具类的相关文章

Java 实现简单的SQL动态组装工具类

第一版 package com.zh.oukele.util; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class CreateSqlUtil { public static void main(String[] args) { Map<String ,Object> map = new HashMap<>(); map.put("stuName&q

Java中动态代理技术生成的类与原始类的区别 (转)

用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后来定义的逻辑.这样就达到了动态的在原有类上增加一些功能.比如日志打印,拦截信息等. 这里只关心动态代理技术生成新的类,先不管虚拟机是如何去生成类,用了什么字节码生成技术,怎么产生字节码等这一系列动作.现在只关心最后生成的新类长什么样,它和老类有什么区别.为了获取到生成后的代理类的字节码并且反编译成我

Java中的静态代理、通用动态代理类以及原理剖析

代理模式和静态代理 在开发中,代理模式是常用的模式之一,一般来说我们使用的代理模式基本上都是静态代理,实现模式大致如下 : 我们以网络代理为例,简单演示一下静态代理的实现 : // 网络接口 interface Network { public void surfTheInternet(); public void gotoFacebook(); } // 普通网络 class CommonNetwork implements Network { @Override public void su

java动态代理的实现

动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy).那么有没有一种机制能够让系统在运行时动态创建代理类?答案就是本文将要介绍的动态代理(Dynamic Proxy).动态代理是一种较

JDK动态代理实现原理

之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的.直到看了他的文章才彻底明白,附网址:http://rejoy.iteye.com/blog/1627405 Java代码   package dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import j

老王讲自制RPC框架.(二.动态代理)

(#简介) 什么是动态代理?动态代理是实现阶段不关心代理是谁,而在运行阶段才指定代理对象是哪一个,动态代理在做框架方面使用非常 广泛,比如spring的aop,其核心就是采用动态代理机制,下面让我们来看看如何实现一个动态代理模式 (#实现) 首先我们来定义一个接口 public interface ICar { void run(String name); } 然后我们来定义一个实现类 public class Car implements ICar { public void run(Stri

JDK动态代理

一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A proxy is an agent or substitute authorized to act for another person or a document which authorizes the agent so to act. 意思是说:代理指的是一个代理人(或替代品),它被授权代表

深入浅出java静态代理和动态代理

首先介绍一下,什么是代理: 代理模式,是常用的设计模式.特征是,代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类.以及事后处理消息. 代理类和委托类,存在着关联关系.代理类的对象本身并不真正实现服务,知识通过调用委托类的对象的相关方法. 代理类可以分为两种:静态代理和动态代理. 静态代理: 代理类是由程序员创建,或由工具生成的代码 编译成的.在程序运行前,代理类的 *.class文件已经存在了.直接就可以运行 . 动态代理: 动态代理的代理类.没有直接由

动态代理方案性能对比 (CGLIB,ASSIT,JDK)

动态代理工具比较成熟的产品有: JDK自带的,ASM,CGLIB(基于ASM包装),JAVAASSIST, 使用的版本分别为: JDK-1.6.0_18-b07, ASM-3.3, CGLIB-2.2, JAVAASSIST-3.11.0.GA (一) 测试结果: 数据为执行三次,每次调用一千万次代理方法的结果,测试代码后面有贴出. (1) PC机测试结果:Linux 2.6.9-42.ELsmp(32bit), 2 Cores CPU(Intel Pentium4 3.06GHz) Java代