反射/代理/spring AOP

Class 对象

Class myObjectClass = MyObject.class;
String className = ... ;//在运行期获取的类名字符串
Class class = Class.forName(className);//类的全名,这个全名包括类所在的包的名字
Class aClass = ... //全限定类名(包含包名)
String className = aClass.getName();//全限定类名(包含包名)
String simpleClassName = aClass.getSimpleName();//类的名字(不包含包名)
int modifiers = aClass.getModifiers();//类的修饰符, 即public,private,static 等等的关键字
Modifier.isAbstract(int modifiers);
Modifier.isFinal(int modifiers);//.......检查修饰符的类型
Package package = aClass.getPackage();//获取包的相关信息,比如包名,你也可以通过 Manifest 文件访问位于编译路径下 jar 包的指定信息,比如你可以在 Manifest 文件中指定包的版本编号
Class superclass = aClass.getSuperclass();//访问类的父类
Class[] interfaces = aClass.getInterfaces();//获取指定类所实现的接口集合,当前类的父类如果实现了接口,这些接口是不会在返回的 Class 集合中的,尽管实际上当前类其实已经实现了父类接口
Constructor[] constructors = aClass.getConstructors();//构造器
Method[] method = aClass.getMethods();//所有方法
Field[] method = aClass.getFields();//类的成员变量
Annotation[] annotations = aClass.getAnnotations();//类的注解

Java 构造器

Class aClass = ...//获取Class对象
Constructor[] constructors = aClass.getConstructors();//Constructor 数组包含每一个声明为公有的(Public)构造方法
Constructor constructor = aClass.getConstructor(new Class[]{String.class});//知道要访问的构造方法的参数类型,获取指定的构造方法
Class[] parameterTypes = constructor.getParameterTypes();//获取指定构造方法的方法参数信息
实例化一个类:Constructor constructor = MyObject.class.getConstructor(String.class);
MyObject myObject = (MyObject)constructor.newInstance("constructor-arg1");

获取 Field 对象

Class aClass = ...//获取Class对象
Field[] methods = aClass.getFields();
Field field = aClass.getField("someField");
String fieldName = field.getName();//获取变量名称
Object fieldType = field.getType();//变量的类型

获取或设置(get/set)变量值:
Class  aClass = MyObject.class
Field field = aClass.getField("someField");
MyObject objectInstance = new MyObject();
Object value = field.get(objectInstance);//获取实例objectInstance的变量someField的值
field.set(objetInstance, value);//设置变量值

获取 Method 对象

Class aClass = ...//获取Class对象
Method[] methods = aClass.getMethods();//数组包含了指定类中声明为公有的(public)的所有变量集合
Method method = aClass.getMethod("doSomething", new Class[]{String.class});//方法名称是“doSomething”,方法参数是 String 类型, 没有参数传入第二个参数传入null
Class[] parameterTypes = method.getParameterTypes();//获取指定方法的方法参数
Class returnType = method.getReturnType();//获取指定方法的返回类型
//获取一个方法名为doSomesthing,参数类型为String的方法
Method method = MyObject.class.getMethod("doSomething", String.class);
Object returnValue = method.invoke(null, "parameter-value1");//第一个参数为null表示该方法是静态方法

Getter 和 Setter

不能直接寻找 getters 和 setters,你需要检查一个类所有的方法来判断哪个方法是 getters 和 settersGetter 方法的名字以 get 开头,没有方法参数,返回一个值。

Setter 方法的名字以 set 开头,有一个方法参数。

访问私有变量

Class.getDeclaredField(String name)方法或者 Class.getDeclaredFields()方法

privateStringField.setAccessible(true)这行代码,通过调用 setAccessible()方法会关闭指定类 Field 实例的反射访问检查,这行代码执行之后不论是私有的、受保护的以及包访问的作用域,你都可以在任何地方访问,即使你不在他的访问权限作用域之内。但是你如果你用一般代码来访问这些不在你权限作用域之内的代码依然是不可以的,在编译的时候就会报错。

访问私有方法

Class.getDeclaredMethod(String name, Class[] parameterTypes)或者 Class.getDeclaredMethods() 方法

Method.setAcessible(true) 功能类似

 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
时间: 2024-12-22 10:17:11

反射/代理/spring AOP的相关文章

Java动态代理-->Spring AOP

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性

动态代理--Spring AOP分析

Spring AOP的基本实现方式 ?Spring AOP,一种模块化机制,可以动态的对切点增加行为,而不破坏原有的代码结构.这是一个很好地动态代理的应用方式,Spring AOP实现依赖于JDK的动态代理库和CGLIB字节码库技术两种来分别实现. ?在Spring AOP中,JdkDynamicAopProxy实现基于JDK动态代理生成代理对象,CglibAopProxy来实现基于CGLIB的动态代理对象生成.并通过DefaultAopProxyFactory进行调用,此处采用策略模式,针对不

Spring AOP中的动态代理

0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1 JdkDynamicAopProxy 2.2 CglibAopProxy 3 总结 0  前言 前一个季度旅游TDC的Thames服务有几次宕机,根据组内原因认真查找发现是数据库事务造成的,后来把服务中的事务配置全部去掉,服务恢复正常.根据这次教训,虽然现在还是很难确定是哪一个方面的真正原因,但是激

Spring AOP学习笔记(1)-概念

1.Aspect 横切在多个类的一个关注点,在Spring AOP中,aspect实现是一个规则的类或@Aspect标注的规则类.例如:事务管理 2.Join point 程序执行过程中的一个点,例如:执行一个方法或处理一个异常,在Spring AOP中,一个连接点表示一个方法执行执行 3.Advice 在一个特定的连接点上所采取的动作,类型包括around,before,after等,Spring中 advice就是一个interceptor模式,包括around连接点的interceptor

[Spring框架]Spring AOP基础入门总结一.

前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务

sbs spring aop

Aop 术语 连接点(Joinpoint) 连接点是程序执行的某个特定的位置,如类开始初始化前.类初始化后.累的某个方法调用前/调用后.方法抛出异常后. spring仅支持方法的连接点,也就是: 方法调用前 方法调用后 方法抛出异常时 方法调用前后 切点(Pointcut) 切点和连接点不是一对一的关系,一个切点可以匹配多个连接点. 连接点相当于数据库中的记录,切点相当于查询条件. 在spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和

Spring AOP介绍

1.介绍 AOP(面向切面编程)对OOP(面向对象编程)是一种补充,它提供了另一种程序结构的思路.OOP的模块单元是class,而AOP的模块单元是aspect.Spring中一个关键的组件是AOP框架,然而,Spring IoC容器并不依赖于AOP,也就是说如果你不想用AOP的话可以不用. 在Spring框架中AOP用来做什么呢? 提供声明式的企业服务,特别是代替EJB的声明式服务.最重要的的服务是声明式事务管理. 允许用户实现自定义的aspect 1.1.AOP概念 Aspect(方面):横

Spring AOP:概念

什么是AOP AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是软件开发思想发展到一定阶段的产物,但AOP的出现并不是要完全替代OOP,而仅作为OOP的有益补充. AOP是有特定的应用场合的,它只适合那些具有横切逻辑的应用场合,如性能检测.访问控制.事务管理及日志记录等.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的

spring aop 动态代理批量调用方法实例

今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候要批量调用这些同名方法,我觉得这里可以发展成有潜力的代码. 推送比较好做数据,队友们都写好代码,但是有个问题,方法要的值都大致相同,封装的方式不一致,多人开发,有的封装对象里面,有的直接使用 Map.get(),唉,一千个人一千个哈姆雷特嘛,只好利用反射和动态代理节省自己的代码量,而且这种方式练练手