Java反射机制 以及 method.invoke运用

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"。使用参数argsobj(底层方法的对象) 上指派该对象所表示方法的结果

 

方案二:

通过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=绿色

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章