JAVA反射与注解实例
1 JAVA反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。或者说,JAVA反射机制指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
2 JAVA 注解
Annotation(注解)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。
3 注解BEAN
自定义注解类,如下:
@Retention(RetentionPolicy.RUNTIME)
public @interface PropertyInfoAnnotation {
public String code(); // 代码
public String name(); // 名称
public long orderNo();// 排序顺序号
};
简单JAVA BEAN如下:
public class BaseMeasureData {
@PropertyNameAnnotation(code="IN",name="指标代码",orderNo=1)
private String iN;
@PropertyNameAnnotation(code="DN",name="维度",orderNo=2)
private String dN;
@PropertyNameAnnotation(code="VV",name="数据值",orderNo=3)
private String vV;
public String getIN() {
return iN;
}
public void setiN(String iN) {
this.iN = iN;
}
public String getDN() {
return dN;
}
public void setdN(String dN) {
this.dN = dN;
}
public String getVV() {
return vV;
}
public void setvV(String vV) {
this.vV = vV;
}
4 注释帮助类
注释管理器,作为访问注释信息的入口,如下:
public class PropertyHelper {
// 用于禁止在类外部用构造函数实例化该类。
private PropertyHelper() {
}
private static PropertyHelper instance=new PropertyHelper();
public static PropertyHelper getInstance(){
return instance;
}
private Map<Class,Map<String,Long>> beanCachePropertyCodeMap=new HashMap<Class,Map<String,Long>>();
/**
* 获取属性代码及排序顺序号。
* @param bean
* @return
*/
public Map<String,Long> getBeanPropertyCode(Object bean){
Map<String,Long> result=null;
result=(Map<String,Long>)this.beanCachePropertyCodeMap.get(bean.getClass());
if(result!=null)
return result;
else{
result=this.propertyCodeParse(bean);
this.beanCachePropertyCodeMap.put(bean.getClass(), result);
}
return result;
}
/**
* 将类的属性代码及排序顺序号保存到内存对象。
* @param bean
* @return
*/
private Map<String,Long> propertyCodeParse(Object bean){
Map<String,Long> result=null;
if(bean==null)
return null;
Field[] fields=bean.getClass().getDeclaredFields();
if ( fields == null) {
return null;
}
result=new HashMap<String,Long>(fields.length);
for (Field field : fields) {
if (field.isAnnotationPresent(PropertyNameAnnotation.class)) {
PropertyNameAnnotation annotation=field.getAnnotation(PropertyNameAnnotation.class);
result.put(annotation.code(), Long.valueOf(annotation.orderNo()));
}
}
return result;
}
/**
* 获取排序的属性代码。
* @return
*/
public String[] getOrderedCode(Object bean) {
final Map<String,Long> map = getInstance().getBeanPropertyCode(bean);
Set<String> set = map.keySet();
String [] result = set.toArray(new String[set.size()]);
Arrays.sort(result, new Comparator<Object>(){
public int compare(Object o1, Object o2) {
return map.get(o1).compareTo(map.get(o2));
}
});
return (String[])result;
}
};
5 反射与注释应用
private void getObjPro(Object obj, Map dataMap, String className) {
Class clas;
if (obj == null) {
clas = Class.forName(className);
obj = clas.newInstance();
} else {
clas = Class.forName(obj.getClass().getName());
}
//得到obj类的所有属性
Field[] fileds = clas.getDeclaredFields();
for (Field field : fileds) {
String fieldName = field.getName();
String fieldType = field.getType().getName();
PropertyNameAnnotation annotation=field.getAnnotation(PropertyNameAnnotation.class);
if (null == annotation) {
return ;
}
String propertyCode = annotation.code();
// 属性名的第一个字母大写,与get或者is组成方法名
String firstCharUpper = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1, fieldName.length());
Method method;
//如果是boolean型则方法名为is*;反之为get*
if (isBooleanType(fieldType)) {
method = clas.getMethod("is" + firstCharUpper, null);
} else {
method = clas.getMethod("get" + firstCharUpper, null);
}
if (isSysDefinedType(fieldType)) {
//如果是系统类型则添加进入map
String formatDateStr = isTimeType(fieldType, method, obj);
if (formatDateStr != null) {
dataMap.put(propertyCode, formatDateStr);
continue;
}
dataMap.put(propertyCode, method.invoke(obj, null) == null ? "" : method.invoke(obj, null)); //执行方法,将结果保存到dataMap。
}
}
}
相关推荐
下面小编就为大家带来一篇Java 自定义注解及利用反射读取注解的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息
NULL 博文链接:https://zyqwst.iteye.com/blog/2255560
主要介绍了java注解之运行时修改字段的注解值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
常见的应用如下 逆向代码 ,例如反编译 与注解相结合的框架 例如Retrofit 单纯的反射机制应用框架 例如EventBus 2.x 动态生成类框架 例如Gson Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第8页...
主要介绍了Java使用注解和反射简化编程的方法,结合实例形式分析了java使用注解和反射调用大量函数简化编程的相关操作技巧,需要的朋友可以参考下
本篇文章主要介绍了java反射和自定义注解的综合应用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Java基于反射机制实现全部注解获取的方法,结合实例形式分析了java反射机制获取注解的具体实现方法与操作注意事项,需要的朋友可以参考下
1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义如下: 注解 含义 @Component 标注Bean @Autowired 标注需要被注入的...
下面小编就为大家带来一篇Java利用自定义注解、反射实现简单BaseDao实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Java通过反射访问注解信息的方法,结合实例形式分析了java基于反射访问类成员方法注解信息的相关操作技巧,需要的朋友可以参考下
这是『Java学习指南系列』的第18篇教程 ,是Java开发的高级课程,介绍反射机制、注解和框架设计的一般性原理。 二、主要内容 本篇包含以下内容: * 使用反射机制,读取Class中的字段信息 * 使用反射机制,对...
通过反射获得实体类的字段和值
Class 类的实例表示正在运行的 Java 应用程序中的类和接口; 枚举是一种类,注解(指的是注解Annotation)是一种接口; 每个数组都是 Class字节码类中的一个具体 对象 基本的 Java 类型(boolean、byte、...
Java基础 反射篇 - Java基础 反射篇 - 反射的思想及作用 - 反射的基本使用 - 获取类的 Class 对象 - 构造类的实例化对象 - 获取一个类的所有信息 - 获取类中的变量(Field) - 获取类中的方法(Method) - ...
JAVA反射与动态代理 40 基本用法 40 处理泛型 42 动态代理 42 使用案例 43 参考资料 44 JAVA I/O 45 流 45 缓冲区 47 字符与编码 48 通道 49 参考资料 52 JAVA安全 53 认证 53 权限控制 55 加密、解密与签名 57 安全...
Java基础 反射篇 反射的思想及作用 反射的基本使用 获取类的 Class 对象 构造类的实例化对象 获取一个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过...
注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。...· 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。
与 Exception 有关的 Java 关键字 throws 和 throw try 、finally 、catch 什么是 Error 内部类 创建内部类集合 Iterable 接口顶层接口 ArrayList Vector LinkedList 类Stack HashSet TreeSet LinkedHashSet 类 ...
15.2 使用Java反射机制414 15.2.1 获取类型信息414 15.2.2 创建对象417 15.2.3 调用方法419 15.2.4 访问成员变量的值421 15.2.5 操作数组422 15.3 反射与动态代理424 15.3.1 静态代理424 15.3.2 动态代理426 15.4 本...