package test;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author 0414
*
*/
public class TestReflectChecker {
public class Param {
private String id;
private String name;
private String year;
private String month;
private String day;
public Param() {}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMonth() {
return month;
}
public void setMonth(String month) {
this.month = month;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
}
/**
* CHECK_FIELD
*/
private enum CHECK_FIELD {
id,
name,
year,
month,
day
}
private static Map<String, CHECK_FIELD[]> matchMap = new HashMap<String, CHECK_FIELD[]>();
static {
//id 1 : name is not null;
matchMap.put("1",
new CHECK_FIELD[] { CHECK_FIELD.id, CHECK_FIELD.name });
//id 2 : year, month, day is not null;
matchMap.put("2", new CHECK_FIELD[] { CHECK_FIELD.id, CHECK_FIELD.year,
CHECK_FIELD.month, CHECK_FIELD.day });
}
private TestReflectChecker() {
}
/**
* パラメータをチェック
*
* @param param
* @return
*/
public static boolean check(Param param) {
if (param == null) {
return false;
}
String id = param.getId();
CHECK_FIELD[] checkFields = matchMap.get(id);
if (checkFields == null) {
return false;
}
for (CHECK_FIELD field : checkFields) {
Method getFieldMethod = getGetMehtodByField(Param.class, field
.toString());
try {
Object value = getFieldMethod.invoke(param, new Object[] {});
if (value == null) {
System.out.println(field + " is null, false will be return .");
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
/**
* fieldからmethodを取得
*
* @param clazz
* @param field
* @return
*/
private static Method getGetMehtodByField(Class clazz, String field) {
Method method = null;
String methodName = "get" + field.substring(0, 1).toUpperCase()
+ field.substring(1);
try {
method = clazz.getMethod(methodName, new Class[] {});
} catch (Exception e) {
e.printStackTrace();
}
return method;
}
public static void main(String[] args) {
Param param = new TestReflectChecker().new Param();
param.setId("1");
param.setName("name");
System.out.println(TestReflectChecker.check(param));
param.setId("2");
param.setYear("2011");
System.out.println(TestReflectChecker.check(param));
}
}
分享到:
相关推荐
注解是一种元数据,可以为编译器、工具或运行时系统提供信息,而反射则允许程序在运行时检查类、接口、字段和方法的信息,并能动态地调用方法或访问属性。下面我们将详细探讨这两个概念以及它们的实例应用。 ### ...
反射,Java中的一种机制,允许在运行时检查和操作类、字段和方法,实现动态加载和调用。 ### script 脚本,一系列命令或代码的集合,用于自动化执行特定任务,如Shell脚本或JavaScript。 ### static 静态,用于...
### Java宝典(第四版):关键知识点综述 #### 一、JVM与Java内存管理 ##### 1.1 JVM **Java内存模型(JMM)**:JMM定义了程序中各种变量(线程共享变量)的访问规则,以及在并发环境下变量的存储与读取假设。它是...
- `final` 类中的所有字段也是不可变的,这意味着一旦创建了一个 `final` 类的对象,其状态就不能被修改。 **11. 继承时候类的执行顺序问题** 继承时类的执行顺序遵循从父类到子类的原则,先执行父类构造器再执行...
- 水平拆分:按某个字段的值范围将数据分散到多个表或库中。 - 垂直拆分:按业务模块将数据拆分到不同的表或库中。 - **如何保证不同数据结构的数据一致性**: - 使用事务管理确保原子性。 - 应用最终一致性的...
- `List<String>` 不能转换为 `List<Object>`,因为类型参数是不可协变的。 33. **解析 XML 的几种方式**: - DOM:将整个文档加载到内存中。 - SAX:事件驱动模型,逐个解析文档。 - PULL:简化版的 SAX,便于...
### Java反射面试题详解 #### 1. 除了使用 new 创建对象之外,还可以用什么方法创建对象? - **Class.forName().newInstance()**:通过类名创建对象。 - **Constructor.newInstance()**:通过构造函数创建对象。 - *...
- Java规定子类不能抛出比父类更多的异常。 - 这样做是为了保持程序的兼容性和稳定性。 #### 五、多线程 **1. 继承Thread类,为什么要继承run方法** - 继承`Thread`类时需要覆盖`run`方法。 - `run`方法的实现...
- **接口**:只能包含抽象方法(Java 8之后也可以包含默认方法和静态方法),不能包含成员变量(只有静态常量);一个类可以实现多个接口。 #### 19. 什么是类的反射机制? 反射机制允许程序在运行时获取类的信息并...
- **transient关键字用于标记对象中不希望被序列化的字段。** #### 四十九、反射机制 - **反射:** 允许程序在运行时获取类的信息,并动态创建对象和调用方法。 - **应用场景:** 动态加载类、框架开发、测试等。 #...
注解可以应用于包、类、字段、方法、局部变量以及方法参数等,提供了对代码的非侵入式注解方式。 一、注解的种类与用途 1. 标记注解:这类注解通常用于提供编译器或工具的信息,没有实际的行为。例如,`@Override`...
反射机制允许运行时检查类的信息,包括字段、方法和构造函数,并动态调用方法或创建对象。 #### 20. 类的返射机制中的包及核心类? 反射相关的包是`java.lang.reflect`,核心类包括`Class`、`Constructor`、`Field`...
- **null的作用**:用于表示对象引用未初始化或被显式设置为空。 - **NullPointerException**:当尝试访问null引用的对象成员时会抛出该异常。 #### 12. Java中Comparable与Comparator的区别 - **Comparable接口**...
- **预防措施**:在调用前检查指针是否为空。 ### Hadoop #### MapReduce - **原理**:分布式处理大量数据集的一种编程模型。 - **流程**:包括Map阶段和Reduce阶段。 - **应用**:广泛应用于大数据处理领域。 #...
`@Deprecated`则是表示某个方法或类已经过时,不建议使用,IDE会在使用的地方显示警告。 2. **一般注解**:例如`@SuppressWarnings`,可以关闭特定类型的编译器警告。例如,`@SuppressWarnings("deprecation")`可以...
5. **泛型和参数化类型**:由于Java泛型的类型擦除,ProGuard可能无法正确处理这些类型。在混淆规则中添加针对泛型类和方法的保留规则,以避免混淆。 6. **保留枚举常量**:枚举类型的常量如果不特别指定,可能会被...