JAVA的反射机制及代理机制

反射机制:
用于获取运行时信息,对自身的JAVA程序进行检查并直接操作程序内部的属性。例如可以获取某个对象的属性,执行某个对象的方法,新建实例等。
而反射机制是如今许多流行框架的实现基础,包括Spring、Hibernate等。
不过,使用反射会比较消耗资源。

代理机制:
JAVA中的另一个重要机制,包括静态和动态两种。为了将业务逻辑和核心业务分离,代理位于调用者和核心业务之间,由代理去实现业务逻辑,当业务逻辑修改时,修改代理即可,不会影响到核心业务。
静态代理是实现清楚需代理的接口(函数),然后编写代理,相同的接口但在实现中完成业务逻辑。
动态代理是代理同一业务逻辑的接口,即给出需要代理的多个接口,由代理来完成相同的业务逻辑。既能动态的创建代理对象,又能动态的调用代理方法。
动态代理中一个重要API:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,  InvocationHandler h)
throws IllegalArgumentException
说明:
参数:loader-需代理对象的类加载器;interfaces-被代理对象的需代理接口;h-处理程序。
返回:具备需代理接口的代理对象,当调用代理接口时,会直接调用h中的invoke函数。
代理机制是Spring的AOP的最底层实现。把各种业务逻辑分离开来了,不管是核心要处理的还是作为辅助功能(或者测试)的业务逻辑,比如日志作为一个切面可以去测试每个方法是否都执行了,用AOP就不需要去改动任何核心业务。

使用发射机制实现IOC
IOC(Inverse of Control)又称“控制反转”,或者“依赖注入”。
为了减少类之间的耦合关系,我们可以使用面向接口编程,减少了具体的实现类之间的耦合关系。但我们还需要在类中获取其它的实现类,所以当需要修改实现时还需要在类中进行改正。
在Spring中,通过IOC可以将实现类、参数信息等配置在其对应的配置文件中,那么当需要更改实现类或参数信息时,只需要修改配置文件即可,这种方法更进一步的降低了类与类之间的耦合。我们还可以对某对象所需要的其它对象进行注入,这种注入都是在配置文件中做的,Spring的IOC的实现原理利用的就是Java的反射机制, Spring还充当了工厂的角色,我们不需要自己建立工厂类。Spring的工厂类会帮我们完成配置文件的读取、利用反射机制注入对象等工作,我们可以通过bean的名称获取对应的对象。
首先在配置文件中含有多个bean定义及属性信息,而同时定义某些类与这些bean对应起来。
然后完成一个bean工厂,该工厂读取配置文件获得各个bean定义,通过class属性来实例化对象,通过反射机制来将配置文件中的属性输入到对应bean对象。
    <bean id="javaBean" class="org.amigo.reflection.JavaBean">
       <property name="userName">
           <value>阿蜜果</value>
       </property>
       <property name="password">
           <value>12345678</value>
       </property>
    </bean>
最后,直接使用需要的bean对象即可。

使用动态代理机制实现AOP
AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。它的主要意图就要将日志记录,性能统计,安全控制等等代码从商业逻辑代码中清楚的划分出来,我们可以把这些行为一个一个单独看作系统所要解决的问题,就是所谓的面向切面的编程。通过对这些行为的分离,我们希望可以将它们独立地配置到商业方法中,而要改变这些行为也不需要影响到商业方法代码。
以下为Spring的事务实现,使用Hibernate的事务处理API。
Spring的事务处理包含编程式事务和声明式事务。
编程式事务即通过编程方式,当然可以自己实现代理,好处是灵活。
声明式事务通过配置文件来使用动态代理实现事务管理。这样的好处是业务逻辑(Dao)就不会意识到事务管理的存在,而且维护起来极其方便。
Spring中的代理为:org.springframework.transaction.interceptor.TransactionProxyFactoryBean
需要在配置文件中填写:proxyInterfaces-需代理接口;target-被代理对象;transactionManager-事务处理器;transactionAttributes-事务属性(传播行为、隔离等级等)。

WORDSPARROW中AOP解决权限问题实例
问题来源:
系统管理模块人员开发过程中需要将代码加入到我所负责模块的每个功能接口实现中去,感觉比较别扭。
1.每个功能模块的业务逻辑变得复杂起来;
2.两人的工作耦合性加大,自身程序受限于他人,当权限模块需要改变时可能需要到我的代码中去修改。
3.整个系统结构变得不清晰,权限功能内嵌到各个模块中去了。
4.机械化的重复代码。
解决:
使用Spring的AOP功能,将权限功能实现构建成一个组件,在调用核心业务之前进行调用,即可控制了系统全局的权限控制。
1.人员工作不再因为权限而交叉受限;
2.系统结构清晰明了,开发人员实现模块功能清晰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值