`
weiqingfei
  • 浏览: 311740 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

java中对程序进行修改的时机。

    博客分类:
  • Java
阅读更多

1.编译期(预处理),用的是apt,通过编译器javac的-processor参数,指定注解预处理类,对程序进行修改。

这个时期可以做的事情,可以通过解析原程序生成的抽象语法树(AST)来创建新的源程序。

日本比较有名的orm框架doma2用的就是这种方法,比如自动实例化Dao interface生成实例化后的源文件。

也可以对抽象语法数(AST)进行修改,编译成新的class。

Lombok就是这样做的。

可以参照这个网页看看Lombok的运行原理

https://my.oschina.net/wangmengjun/blog/821976

 

 

2.编译期,这个必须用自定义的编译器,而不是标准的javac。

自定义的编译器里,会根据额外的配置和处理,把一个java源文件编译成一个增强了的类文件。

aspectj的ctw模式用的就是这个方法


3.类加载,用的是javaagent,通过java的-javaagent参数,指定代理类,在加载类的时候,对类进行动态修改。

由于类加载的时候,就完成了修改,所以不管以什么方式创建实例的时候,用的都是修改后的类

aspectj的ltw模式就是用的这个方法

 

4.创建实例,这里不能用new关键字去创建了,一般是通过一个类容器来创建,容器里对再对类进行改造,创建一个代理类(有interface的时候)的实例,或者创建一个子类(没有interface的时候)的实例。也就是说实际上类的实例已经不是原来那个类的了。

spring的proxy模式用的就是这个方法

分享到:
评论

相关推荐

    Java的六大问题你都懂了吗

    例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:  public class Demo {  private String s;  public Demo {  s = "Initial Value";}  }  而非  s = new ...

    计算机毕业设计-微信小程序汉中茗茶微系统设计与实现修改代码+论文+项目源代码.rar

    微信小程序“汉中茗茶微系统”是一个专为茶叶爱好者和汉中地区茶叶销售商设计的综合性信息服务平台...无论是茶叶销售商还是普通用户,都可以根据自己的需求对系统进行二次开发或定制,以满足特定的业务需求或个人喜好。

    设计失效模式及后果分析程序 D-FMEA

    设计失效模式及后果分析程序...2、DFMEA是一份动态文件,应在一个设计概念最终形成之时或之前开始,而且,在产品开发各阶段中,当设计有变化或得到其它信息时,应及时、不断地修改,并最终在产品图样完成之前全部结束;

    股票买卖最佳时机leetcode-Portfolio-Manager:投资组合经理

    股票买卖最佳时机leetcode 使用 Java Spring 的股票投资组合管理器应用程序 如何运行 在项目文件夹(包含此文件的文件夹)中打开终端窗口并键入: java -jar target/FyberChallenge-0.0.1-SNAPSHOT.jar 应用程序应该...

    二十三种设计模式【PDF版】

    文章中还对 Jive再进行了剖析。 设计模式之 Decorator(装饰器) Decorator 是个油漆工,给你的东东的外表刷上美丽的颜色. 设计模式之 Bridge(桥连) 将牛郎织女分开(本应在一起,分开他们,形成两个接口),在他们之间...

    Eclipse权威开发指南2.pdf

    第4章 Java程序的运行与调试 107 4.1 运行Java代码...... 108 4.1.1 使用运行和调试命令..... 108 4.1.2 管理启动配置..... 109 4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 ...

    Eclipse权威开发指南3.pdf

    第4章 Java程序的运行与调试 107 4.1 运行Java代码...... 108 4.1.1 使用运行和调试命令..... 108 4.1.2 管理启动配置..... 109 4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试.....

    Eclipse权威开发指南1.pdf

    第4章 Java程序的运行与调试 107 4.1 运行Java代码...... 108 4.1.1 使用运行和调试命令..... 108 4.1.2 管理启动配置..... 109 4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试.....

    Spring.net框架

    在 Step1到Step3-Reflection的例子中,我们试图 利用“针对接口编程”以及自己设计的Ioc对系统进行解耦。在Step3到Step5的例子中,我们将利用Spring.net提供的Ioc框架,轻松完 成解耦以及系统改造等工作。 一、类...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。 作译者 john sharp,content master首席技术专家。content master隶属于cm集团,cm集团...

    spring aop 实现源代码--xml and annotation(带lib包)

    假如有一天我们的应用程序不需要再业务代码执行前记录日志了,只需要修改XML文件中的定义,而不用更改AdviceDemo的代码: xml 代码 1. <bean id="messageSender" class="com.savage.aop.HttpMessageSender">bean> ...

    SVN服务器VS2005客户端part2

    Codehaus、Sourceforge、Savannah 和 Java™ 社区的 java.net 等站点中驻留的免费 CVS 使得为开源项目建设存储库更为简单。以 CVS 为中心,已发展起一个大型的附件市场,包括 TortoiseCVS、ViewCVS 和 Fisheye 等...

    SVN服务器与VS2005客户端par1

    Codehaus、Sourceforge、Savannah 和 Java™ 社区的 java.net 等站点中驻留的免费 CVS 使得为开源项目建设存储库更为简单。以 CVS 为中心,已发展起一个大型的附件市场,包括 TortoiseCVS、ViewCVS 和 Fisheye 等...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    6.5.2 对安全性至关重要的实例参数 193 6.6 使用标准数据库审核 197 6.6.1 审核SYSDBA活动 198 6.6.2 数据库审核 198 6.6.3 使用触发器执行基于值的审核 200 6.6.4 细粒度审核(FGA) 201 6.7 本章知识点回顾 ...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第1/2部分)

    6.5.2 对安全性至关重要的实例参数 193 6.6 使用标准数据库审核 197 6.6.1 审核SYSDBA活动 198 6.6.2 数据库审核 198 6.6.3 使用触发器执行基于值的审核 200 6.6.4 细粒度审核(FGA) 201 6.7 本章知识点回顾 ...

Global site tag (gtag.js) - Google Analytics