近来封装了很多发射的小方法,使用过程中,发觉发射的好处是:当很多类有共性时,使用发射,可以达到只做一次,到处使用的效果。就像Hibernate一样,save(obj),我并不需要知道obj到底是哪个类,Hibernate自动会正确的把记录保存到数据库!
备注:
我使用反射封装一些小方法,是为了对大部分有共性的方法通用,所以要求,
a.类的属性必须有getXXX与setXXX方法;
b.getXXX,setXXX,XXX必须与类的字段名一致,而首字母大写;
c.getXXX是无参的,setXXX参数只能有1个,而且类型必须与属性一致(除了基础数据类型,他们可以自动打包)
d.最好有一个无参构造函数
我将有关反射的方法都放入了BeanReflectUtil,作为工具类使用。
准备一个简单的类(我的小方法也就只能对简单的类其作用)
public class Person {
private String name;
private int age;
private Date birthday;
public Person() {
}
public Person(String name, int age, Date birthday) {
super();
this.name = name;
this.age = age;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
1.封装getter
/***
* 组装类中某个属性的get方法名称
* StringUtil.upperFirst(String str)是自己封装的,将首字母变大小的小方法;
* @param c
* @param filedName
* @return
* @throws SecurityException
* @throws NoSuchMethodException
*/
public static Method assembleGetMethod(Class<?> c, String filedName) throws SecurityException, NoSuchMethodException {
String methodName = "get" + StringUtil.upperFirst(filedName);
Class<?>[] nullClasses = null;
return c.getDeclaredMethod(methodName, nullClasses);
}
调用方法实例:
Method m = BeanReflectUtil.assembleGetMethod(Person.class, "name");
m.invoke(new Person("jack"), null);
为了进一步——偷懒,将封装一个小方法:
public static Object invokeGetMethod(Class<?> c, String filedName, Object obj)
throws SecurityException, NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
Method method = assembleGetMethod(c, filedName);
Object[] nullObjects = null;
return method.invoke(obj, nullObjects);
}
那么,我们使用某个属性的getter方法时,只需要
BeanReflectUtil.invokeGetMethod(Person.class, "name", new Person("jack"));
就可以了。
2.封装setter方法
与getter方法不一样的地方是:getXXX()是无参的,
所以,封装的时候,需要告诉他参数的类型;调用的时候,要给一个参数!
/***
* 组装类中某个属性的set方法名称
* @param c 要封装哪个类
* @param filed 封装哪个属性
* @return
* @throws SecurityException
* @throws NoSuchMethodException
*/
public static Method assembleSetMethod(Class<?> c, Field field)
throws SecurityException, NoSuchMethodException {
String methodName = "set" + StringUtil.upperFirst(field.getName());
Class<?>[] parameterClasses = new Class[]{field.getType()}; //告诉Java该set方法的参数类型
return c.getDeclaredMethod(methodName, parameterClasses);
}
调用:
Method setMethod = BeanReflectUtil.assembleSetMethod(Person.class, Person.class.getDeclaredField("name"));
Person p = new Person();
setMethod.invoke(p, "jack");
System.out.println(p.getName());
想进一步偷懒,可以
/**
* 封装Set方法,并立刻调用
* @param c 为哪个类封装Set方法
* @param fieldName 属性名称
* @param obj 为哪个对象赋值
* @param fieldValue 赋的值
*/
public static void invokeSetMethod(Class<?> c, String fieldName, Object obj, Object fieldValue)
throws SecurityException, NoSuchFieldException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
Field f = c.getDeclaredField(fieldName);
Method setMethod = assembleSetMethod(c, f);
setMethod.invoke(obj, fieldValue);
}
调用方法:
invokeSetMethod(Person.class, "name", p, "Mike");
System.out.println(p.getName());
但,实际使用中,应该不会用到,
我的想象场景是:有一堆Map<Person p, String name>
我获得set方法后,会为很多Map中的Person的name属性赋上Map中的name值,
所以,不会组装好set后就马上调用,这样效率也太低了。
分享到:
相关推荐
java 的eclipse或idea等 定义变量时 直接引入lombok.jar包 在类外部 引入@AllArgsConstructor @NoArgsConstructor @Data 简便方法引入getter/setter/tostring等方法
eclipse 自动为getter和setter添加中文注释 详细参见 http://blog.csdn.net/kongguoan/article/details/38293137
主要介绍了Vue getter setter,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
getterandsetter
你可以看到这个类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的设计,但并不是必须的。Hibernate也可以直接访问...
java普通类编译成json但只是当前类的有getter、setter方法的版本
自动生成带注释的getter和setter方法(注释)插件
c++的成员变量的get和set生成器,简单易用。
基于getter-setter-postfix-idea-plugin-version-1.2.0进行修改,allsetter、allbuilder的方法后增加了注释
通常我们用idea默认生成的getter和setter方法是不带注释的,当然,我们同样可以设置idea像MyEclipse一样生成带有Javadoc的模板,具体设置方法,大家参考下本
VS2005(C#)插件Getter/Setter生成器
最近因为公司的新项目决定使用Vue.js来做,但在使用的过程中发现了一个有趣的事情,因为发现的这个事情展开了一些对于getter和setter的思考,具体是什么下面通过这篇文章来一起看看吧,有需要的朋友们可以参考学习。
js中getter和setter用法实例分析.docx
eclipse中的setter与getter注释,实体的编写,在代码编写工程中能清晰了解此意
eclipse小工具 getter和setter 自动添加中文的注释
此扩展使您可以使用一个命令快速生成getter和setter。 它在vscode的命令面板中添加了3个命令: 插入PHP getter。 插入PHP setter。 插入PHP getter和setter。 扩展设置 此扩展程序提供以下设置: ...
主要介绍了IDEA中 Getter、Setter 注解不起作用的问题如何解决,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
显然这是一个无关IE(高级IE除外)的话题,尽管如此,有兴趣的同学还是一起来认识一下ECMAScript5标准中getter和setter的实现。在一个对象中,操作其中的属性或方法,通常运用最多的就是读(引用)和写了,譬如说o....
已经拥有一年经验的你真的了解get set方法吗?也许不!以前我以为都有上架项目,这都是太基础的东西,但今天我重新回头看了以前做的笔记,真的是书读百遍,其义自见。