`

java反射检测参数的某个字段不能为空

    博客分类:
  • java
 
阅读更多
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));
	}

}
分享到:
评论

相关推荐

    注解+ 反射实例demo

    注解是一种元数据,可以为编译器、工具或运行时系统提供信息,而反射则允许程序在运行时检查类、接口、字段和方法的信息,并能动态地调用方法或访问属性。下面我们将详细探讨这两个概念以及它们的实例应用。 ### ...

    JAVA常用英文

    反射,Java中的一种机制,允许在运行时检查和操作类、字段和方法,实现动态加载和调用。 ### script 脚本,一系列命令或代码的集合,用于自动化执行特定任务,如Shell脚本或JavaScript。 ### static 静态,用于...

    Java宝典(第四版)

    ### Java宝典(第四版):关键知识点综述 #### 一、JVM与Java内存管理 ##### 1.1 JVM **Java内存模型(JMM)**:JMM定义了程序中各种变量(线程共享变量)的访问规则,以及在并发环境下变量的存储与读取假设。它是...

    Java企业面试题整理及答案

    - `final` 类中的所有字段也是不可变的,这意味着一旦创建了一个 `final` 类的对象,其状态就不能被修改。 **11. 继承时候类的执行顺序问题** 继承时类的执行顺序遵循从父类到子类的原则,先执行父类构造器再执行...

    java高级工程师面试总结

    - 水平拆分:按某个字段的值范围将数据分散到多个表或库中。 - 垂直拆分:按业务模块将数据拆分到不同的表或库中。 - **如何保证不同数据结构的数据一致性**: - 使用事务管理确保原子性。 - 应用最终一致性的...

    java经典面试题

    - `List&lt;String&gt;` 不能转换为 `List&lt;Object&gt;`,因为类型参数是不可协变的。 33. **解析 XML 的几种方式**: - DOM:将整个文档加载到内存中。 - SAX:事件驱动模型,逐个解析文档。 - PULL:简化版的 SAX,便于...

    Java岗面试题大全.pdf

    ### Java反射面试题详解 #### 1. 除了使用 new 创建对象之外,还可以用什么方法创建对象? - **Class.forName().newInstance()**:通过类名创建对象。 - **Constructor.newInstance()**:通过构造函数创建对象。 - *...

    Java经典面试题+答案(带书签)pdf

    - Java规定子类不能抛出比父类更多的异常。 - 这样做是为了保持程序的兼容性和稳定性。 #### 五、多线程 **1. 继承Thread类,为什么要继承run方法** - 继承`Thread`类时需要覆盖`run`方法。 - `run`方法的实现...

    Java面试题以及答案

    - **接口**:只能包含抽象方法(Java 8之后也可以包含默认方法和静态方法),不能包含成员变量(只有静态常量);一个类可以实现多个接口。 #### 19. 什么是类的反射机制? 反射机制允许程序在运行时获取类的信息并...

    java面试笔记整理,包含java,redis,kafka等

    - **transient关键字用于标记对象中不希望被序列化的字段。** #### 四十九、反射机制 - **反射:** 允许程序在运行时获取类的信息,并动态创建对象和调用方法。 - **应用场景:** 动态加载类、框架开发、测试等。 #...

    Java注解编程1

    注解可以应用于包、类、字段、方法、局部变量以及方法参数等,提供了对代码的非侵入式注解方式。 一、注解的种类与用途 1. 标记注解:这类注解通常用于提供编译器或工具的信息,没有实际的行为。例如,`@Override`...

    Java面试题整理精华

    反射机制允许运行时检查类的信息,包括字段、方法和构造函数,并动态调用方法或创建对象。 #### 20. 类的返射机制中的包及核心类? 反射相关的包是`java.lang.reflect`,核心类包括`Class`、`Constructor`、`Field`...

    java面试题及答案-非常全面(包括基础、网络、数据结构、算法及IT大厂面经)

    - **预防措施**:在调用前检查指针是否为空。 ### Hadoop #### MapReduce - **原理**:分布式处理大量数据集的一种编程模型。 - **流程**:包括Map阶段和Reduce阶段。 - **应用**:广泛应用于大数据处理领域。 #...

    Android Studio Annotation注解技术1

    `@Deprecated`则是表示某个方法或类已经过时,不建议使用,IDE会在使用的地方显示警告。 2. **一般注解**:例如`@SuppressWarnings`,可以关闭特定类型的编译器警告。例如,`@SuppressWarnings("deprecation")`可以...

    android 混淆出错 Can't process class 解决办法

    5. **泛型和参数化类型**:由于Java泛型的类型擦除,ProGuard可能无法正确处理这些类型。在混淆规则中添加针对泛型类和方法的保留规则,以避免混淆。 6. **保留枚举常量**:枚举类型的常量如果不特别指定,可能会被...

Global site tag (gtag.js) - Google Analytics