`
kingone4
  • 浏览: 8344 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA动态代理基本实现

阅读更多
使用JDK 6.0 动态编译
更多详细的步骤分析见附件
public class CompilerTest {

	public static void main(String[] args) throws Exception {
		//构建源代码
		StringBuffer src = new StringBuffer();
		String rt = "\r\n";
		src.append("package com.dolla;").append(rt);

		src.append("public class Tank {").append(rt);
			
		src.append("	public void move() {").append(rt);
		src.append("		System.out.println(\"tank moving......\");").append(rt);
		src.append("	}").append(rt);

		src.append("}").append(rt);

		//保存源代码成Java文件
		String tmpJavaFile = System.getProperty("user.dir")+"/src/com/dolla/Tank.java";
		FileWriter fileWriter = new FileWriter(tmpJavaFile);
		fileWriter.write(src.toString());
		fileWriter.flush();
		fileWriter.close();
		
		//使用javac.jar 编译器进行编译
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		
		//获得源文件管理
		StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
		Iterable units = fileMgr.getJavaFileObjects(tmpJavaFile);
		
		//产生编译任务
		CompilationTask task = compiler.getTask(null, fileMgr, null, null, null,units);
		task.call();
		System.out.println("动态编译对象成功.....");
	}
}




public class ProxyTest1 {

	public static void main(String[] args) {
		//逻辑处理类-传入接口实现类的,用于$Proxy0.invoke()回调方法时,进入到用户处理的业务方法
		InvocationHandler handler = new AuthorityCheckProxy(new UserMgrImpl());
		//根据接口类,动态遍历接口的方法,遍历动态生成代理方法,最终返回一个实现了接口的代理类$Proxy0,代理类的方法里面,主要是做调用handler.invoke()方法
		//使得可以回调到用户实现的接口代理逻辑处理类InvocationHandler
		UserMgr userMgrProxy = (UserMgr)Proxy.newProxyInstance(UserMgr.class.getClassLoader(),new Class[]{UserMgr.class},handler);
		
		userMgrProxy.remove(new User("Dolla"));
	}
}

//用户操作接口
interface UserMgr{
	void remove(User u);
}

//接口实现类
class UserMgrImpl implements UserMgr{

	@Override
	public void remove(User u) {
		System.out.println("用户:"+u.getName() + "删除!");
	}
}

//代理逻辑处理类--权限的逻辑检查
class AuthorityCheckProxy implements InvocationHandler{

	private Object target;
	public AuthorityCheckProxy(Object target){
		this.target = target;
	}
	
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] aobj)
			throws Throwable {
		System.out.println("方法执行前检查...");
		System.out.println("权限检查成功....");
		Object o =method.invoke(target, aobj);
		System.out.println("方法执行后检查...");
	    return o;
    }
	
}


输出结果如下:UserMgr userMgrProxy = (UserMgr)Proxy.newProxyInstance()
得到代理对象名称是$Proxy0其实是一个,也就是实现了UserMgr接口的子类
UserMgr userMgrProxy  = new $Proxy0();

生成的动态代理名称:com.dolla.$Proxy0
方法执行前检查...
权限检查成功....
用户:Dolla删除!
方法执行后检查...
分享到:
评论

相关推荐

    java 动态代理实现AOP

    ### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经...总之,通过本篇文章的学习,读者应该能够理解和掌握如何使用Java动态代理来实现AOP的基本原理及实践操作。

    JAVA实现动态代理的简单流程

    在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...

    java动态代理实例

    首先,我们需要了解Java动态代理的基本原理。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于创建代理对象,而`InvocationHandler`接口...

    java动态代理 经典文章(word 2007格式的)

    - `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...

    Java实现动态代理

    在Java中,有两种方式实现动态代理:一种是通过Java的标准库`java.lang.reflect.Proxy`,另一种是使用Java的接口`java.lang.reflect.InvocationHandler`。我们先来看Proxy类,它是Java动态代理的核心,它提供了一种...

    基于Java动态代理和反射机制实现ORM

    Java中的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了实现动态代理的能力。反射则是Java提供的一种能够在运行时分析类、接口、字段和方法等元数据的技术,通过`java.lang.Class`...

    java-jdk动态代理的实现demo

    在Java中,JDK提供了一个`java.lang.reflect.Proxy`类和一个`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理方法调用的逻辑。 ...

    java 动态代理实现注解日志拦截

    在本场景中,我们将探讨如何使用Java动态代理结合注解来实现日志拦截,以便在调用方法时记录相关的日志信息。 首先,让我们了解Java动态代理的基本概念。在Java中,动态代理主要由两个类实现:`java.lang.reflect....

    用Java动态代理实现委托模式

    在Java中,动态代理是实现委托模式的一种常见方式,它允许我们在运行时创建具有特定接口的代理类实例。下面我们将详细探讨如何使用Java动态代理实现委托模式,以及相关的源码和工具应用。 首先,理解委托模式的基本...

    Java动态代理案例演示代码

    以上就是Java动态代理的基本概念和使用方式。在提供的压缩包文件中,可能包含了一个简单的示例,展示了如何创建和使用动态代理。通过阅读和理解这个例子,你可以更深入地掌握动态代理的实现细节。如果你对某个部分有...

    一个简单的java动态代理的实例

    在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心组件来实现代理功能。 首先,我们需要理解代理模式的基本概念。代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在Java中...

    java动态代理(2)

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现指定的接口。这一机制使得我们可以在不修改已有代码的情况下,为已有接口增加额外的功能或者增强已有功能的行为。在Java中,动态...

    Java中的动态代理

    通过本文的学习,我们可以了解到Java动态代理的基本原理以及其实现过程。动态代理不仅可以用于扩展已有类的功能,还可以简化代码结构,提高程序的可维护性和扩展性。对于开发人员来说,掌握这一技术将有助于更好地...

    java动态代理新java动态代理新java动态代理新

    Java动态代理是Java反射API提供的一个高级特性,主要用于实现对对象方法的调用拦截。动态代理允许我们在运行时创建一个接口的实现类实例,而无需提前知道其具体实现细节。这在很多框架(如Spring AOP)中得到了广泛...

    java jdk 动态代理 演示demo

    Java JDK提供了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键组件。`Proxy`类用于创建代理对象,而`InvocationHandler`接口定义了一个方法,用于处理代理对象...

    Java动态代理详解; CGLib实现动态代理1

    Java 动态代理详解与 CGLib 实现 在 Java 中,代理模式是一种设计模式,它允许我们在不修改原有对象的基础上,为对象增加额外的功能。代理模式的核心在于代理类(Proxy)作为真实对象(RealSubject)的替代品,提供...

    Java 动态代理和Cglib代理(二)

    在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...

    Java动态代理实现 Proxy InvocationHandler

    在本文中,我们将深入探讨这两个关键组件以及如何使用它们来实现动态代理。 ### 1. Java动态代理的基本概念 动态代理允许我们在运行时创建一个实现了特定接口的新类。这个新类(代理类)可以代理原始类(目标类)...

    java-用Java动态代理实现AOP.pdf

    从文件内容可以看出,文档主要讨论了如何使用Java动态代理来实现AOP的基本原理。文档中提供了一个简单的例子,其中定义了一个业务接口BusinessInterface和一个实现了该接口的BusinessObject类。BusinessObject类中的...

    用Java动态代理实现AOP

    Java 动态代理是实现AOP(面向切面编程)的一种常见方式,尤其适用于日志记录、性能统计、安全控制和事务处理等横切关注点的分离。在Java中,从JDK 1.2开始,`java.lang.reflect.Proxy`类和`java.lang.reflect....

Global site tag (gtag.js) - Google Analytics