使用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详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经...总之,通过本篇文章的学习,读者应该能够理解和掌握如何使用Java动态代理来实现AOP的基本原理及实践操作。
在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...
首先,我们需要了解Java动态代理的基本原理。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于创建代理对象,而`InvocationHandler`接口...
- `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...
在Java中,有两种方式实现动态代理:一种是通过Java的标准库`java.lang.reflect.Proxy`,另一种是使用Java的接口`java.lang.reflect.InvocationHandler`。我们先来看Proxy类,它是Java动态代理的核心,它提供了一种...
Java中的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了实现动态代理的能力。反射则是Java提供的一种能够在运行时分析类、接口、字段和方法等元数据的技术,通过`java.lang.Class`...
在Java中,JDK提供了一个`java.lang.reflect.Proxy`类和一个`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理方法调用的逻辑。 ...
在本场景中,我们将探讨如何使用Java动态代理结合注解来实现日志拦截,以便在调用方法时记录相关的日志信息。 首先,让我们了解Java动态代理的基本概念。在Java中,动态代理主要由两个类实现:`java.lang.reflect....
在Java中,动态代理是实现委托模式的一种常见方式,它允许我们在运行时创建具有特定接口的代理类实例。下面我们将详细探讨如何使用Java动态代理实现委托模式,以及相关的源码和工具应用。 首先,理解委托模式的基本...
以上就是Java动态代理的基本概念和使用方式。在提供的压缩包文件中,可能包含了一个简单的示例,展示了如何创建和使用动态代理。通过阅读和理解这个例子,你可以更深入地掌握动态代理的实现细节。如果你对某个部分有...
在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心组件来实现代理功能。 首先,我们需要理解代理模式的基本概念。代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在Java中...
Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现指定的接口。这一机制使得我们可以在不修改已有代码的情况下,为已有接口增加额外的功能或者增强已有功能的行为。在Java中,动态...
通过本文的学习,我们可以了解到Java动态代理的基本原理以及其实现过程。动态代理不仅可以用于扩展已有类的功能,还可以简化代码结构,提高程序的可维护性和扩展性。对于开发人员来说,掌握这一技术将有助于更好地...
Java动态代理是Java反射API提供的一个高级特性,主要用于实现对对象方法的调用拦截。动态代理允许我们在运行时创建一个接口的实现类实例,而无需提前知道其具体实现细节。这在很多框架(如Spring AOP)中得到了广泛...
Java JDK提供了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键组件。`Proxy`类用于创建代理对象,而`InvocationHandler`接口定义了一个方法,用于处理代理对象...
Java 动态代理详解与 CGLib 实现 在 Java 中,代理模式是一种设计模式,它允许我们在不修改原有对象的基础上,为对象增加额外的功能。代理模式的核心在于代理类(Proxy)作为真实对象(RealSubject)的替代品,提供...
在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...
在本文中,我们将深入探讨这两个关键组件以及如何使用它们来实现动态代理。 ### 1. Java动态代理的基本概念 动态代理允许我们在运行时创建一个实现了特定接口的新类。这个新类(代理类)可以代理原始类(目标类)...
从文件内容可以看出,文档主要讨论了如何使用Java动态代理来实现AOP的基本原理。文档中提供了一个简单的例子,其中定义了一个业务接口BusinessInterface和一个实现了该接口的BusinessObject类。BusinessObject类中的...
Java 动态代理是实现AOP(面向切面编程)的一种常见方式,尤其适用于日志记录、性能统计、安全控制和事务处理等横切关注点的分离。在Java中,从JDK 1.2开始,`java.lang.reflect.Proxy`类和`java.lang.reflect....