JAVA反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
方案一:
在java web 开发中,我们经常会遇到,从后台获取前台的值,将获取的值通过set方法赋值给实体,然后将实体存入数据库中,所以针对这点,我们可以通过method反射机制,写个通用的底层方法(对任何实体都有效),这样一来,我们就不用再去一个一个set到实体中去。
Java反射通过set、get封装到实体Bean中
Textentity 实体类
public class TextEntity {
private Integer num;
private String red;
private String green;
。。。get set方法
}
MethodReflect 测试类
public class MethodReflect {
public static void main(String[] args) throws Exception{
TextEntity text = new TextEntity();
text.setGreen("绿色");
text.setRed("红色");
Exttools(text);
}
public static void Exttools(Object obj)throws Exception{
boolean flag = true;
Field[] file = obj.getClass().getDeclaredFields();
for(Field files :file){
String name = files.getName();
//将第一个字母大写,好进行get和set
String nameCase = name.substring(0, 1).toUpperCase()+name.substring(1);
Method get_method = obj.getClass().getMethod("get"+nameCase);//获取getMethod方法
Method set_method = obj.getClass().getMethod("set"+nameCase,get_method.getReturnType());////获得属性set方法
Class<?> c = get_method.getReturnType();
if("java.lang.String".equals(c.getName())){
set_method.invoke(obj,"123");//set参数
}
System.out.println("name="+nameCase+",invoke="+get_method.invoke(obj));
}
}
}
我们在调用Exttools方法之前,set了TextEntity类,但是我们又进行了invoke,值就改变了。所以输出来的结果是:
name=Num,invoke=0
name=Red,invoke=123
name=Green,invoke=123
=================================================================================
obj.getClass() 得到该对象的class;
Field[] file = obj.getClass().getDeclaredFields();返回此类所有已声明字段的 Field
对象的数组。让Field获得对象中所有的字段。
TextEntity是一个类,getNum()、getRed()和getGreen()是该类中的方法,现在通过Class类的getMethod方法获得获得这三个方法属性。
Method m = TextEntity.class.getMethod("getNum");//获得TextEntity类中的公共方法
这里的class是一个字段,表示这个类对应的Class类的对象,再调用其中的getMethod(name
- 方法名)返回的是类中指定方法名。
Method.invoke(obj,"123");//执行该Method.invoke方法的参数,意思是执行这个方法的对象obj(),和参数"123"。使用参数args
在
obj(底层方法的对象)
上指派该对象所表示方法的结果
方案二:
通过Java反射进行实体Bean非空判断
同上Textentity 实体类
MethodReflect 测试类
public class MethodReflect {
public static void main(String[] args) throws Exception{
TextEntity text = new TextEntity();
text.setGreen("绿色");
text.setRed("红色");
Exttools(text);
}
public static void Exttools(Object obj)throws Exception{
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
String name = fields[i].getName();
// 将属性的首字符大写,方便构造get,set方法
name = name.substring(0, 1).toUpperCase() + name.substring(1);
Method m = obj.getClass().getMethod("get" + name);
System.out.println("name="+name+" invoke="+m.invoke(obj));
if (null == m.invoke(obj) || "".equals(m.invoke(obj))) {
if("Green".equals(name)){
System.out.println("绿色为空");
}else if("Num".equals(name)){
System.out.println("数字为空");
}
}
}
}
}
输出结果:
name=Num invoke=null
数字为空
name=Red invoke=红色
name=Green invoke=绿色