反射
反射定义:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能。
反射作用?
反射可以让我们在运行时获取类的属性,方法,构造方法、父类、接口等信息,通过反射还可以让我们在运行期实例化对象、调用方法、即使方法或属性是私有的的也可以通过反射的形式调用。
反射的方法?
getName():获得类的完整名字。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
getClass(): 获取Class对象
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法。
getModifiers()和Modifier.toString():获得属修饰符,例如private,public,static等
getReturnType():获得方法的返回类型
getParameterTypes():获得方法的参数类型
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法。
getSuperclass():获取某类的父类
getInterfaces():获取某类实现的接口
例子:
T t;
// 得到类型T.class
Class entityClass = t.getClass();
//获取实体类的所有属性
Field[] field = entityClass.getDeclaredFields();
// 属性名
field[i].getName()
// 获取实体类的所有方法
Method[] methods = t.getDeclaredMethods();
获取属性值:
method[j]是对应某属性的get方法,method[j].invoke(类的对象)
更好的办法是用org.apache.commons.beanutils.BeanUtils
String str = BeanUtils.getProperty(Object bean, String name)
直接通过对象及属性名就获取到了属性值
存在问题:Boolean类型的属性的方法并不能用get写法(例如getIsBoy写法不对,get 方法名适用于一般属性比如getName);
如果我仅想获取类的部分属性,另外属性不想获取,怎样灵活自己决定?
由此引入自定义注解类。
注解
注解有什么好处?
注解配合反射,可以根据有没有注解、注解的类型或注解上的参数的不同,来执行不同的操作。灵活!
自定义注解类:
说明:方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。
例:
处理excel的自定义注解类,包含表名、列的顺序、是否忽略该字段等等。
// ExcelAttribute.java
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE})
public @interface ExcelAttribute {
/**
* excel里的sheet名,默认是"sheet1"
* @return
*/
String sheetName() default "sheet1";
/**
* excel里对应的列名,默认为""
* @return
*/
String columnName() default "";
/**
* 列对应的排序序号,默认是0
* @return
*/
int order() default 0;
。。。。。。。。。。。。。。
/**
* 字段是否放弃存储到excel里,默认为false
* @return
*/
boolean skip() default false;
}
使用范例:
@Data
@AllArgsConstructor
@ExcelAttribute(sheetName = "stuSheet")
public class Stu {
@ExcelAttribute(columnName="学号",order=0)
private Integer stuNo;
@ExcelAttribute(columnName="是否男孩",order=4)
private Boolean isBoy;
}
获取属性上的注解信息:
ExcelAttribute excelAttribute = null;
// 类的某一属性对应的field,通过Field[] fields = t.getClass().getDeclaredFields();求出
Field field;
// 一个属性对应一个Field,对应一个Annotation(注解)
excelAttribute = field.getAnnotation(ExcelAttribute.class);
获取注解信息例如 excelAttribute.skip() excelAttribute.order()
1963

被折叠的 条评论
为什么被折叠?



