调用get set 方法,需要 某一个类 类中的字段 字段的值来实现
代码:
package entity;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.beans.PropertyDescriptor;
import com.wzty.platform.domain.model.SiteRule;
public class PropertyUtil {
public static PropertyDescriptor getPropertyDescriptor(Class clazz,
String propertyName) {
StringBuffer sb = new StringBuffer(); // 构建一个可变字符串用来构建方法名称
Method setMethod = null;
Method getMethod = null;
PropertyDescriptor pd = null;
try {
Field f = clazz.getDeclaredField(propertyName); // 根据字段名来获取字段
if (f != null) {
// 构建方法的后缀
String methodEnd = propertyName.substring(0, 1).toUpperCase()
+ propertyName.substring(1);
sb.append("set" + methodEnd); // 构建set方法
setMethod = clazz.getDeclaredMethod(sb.toString(),
new Class[] { f.getType() });
sb.delete(0, sb.length()); // 清空整个可变字符串
sb.append("get" + methodEnd); // 构建get方法
// 构建get 方法
getMethod = clazz.getDeclaredMethod(sb.toString(),
new Class[] {});
// 构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中
pd = new PropertyDescriptor(propertyName, getMethod, setMethod);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return pd;
}
public static void setProperty(Object obj, String propertyName, Object value) {
Class clazz = obj.getClass();// 获取对象的类型
PropertyDescriptor pd = getPropertyDescriptor(clazz, propertyName);
Method setMethod = pd.getWriteMethod();// 从属性描述器中获取 set 方法
try {
setMethod.invoke(obj, new Object[] { value });// 调用 set
// 方法将传入的value值保存属性中去
} catch (Exception e) {
e.printStackTrace();
}
}
public static Object getProperty(Object obj, String propertyName) {
Class clazz = obj.getClass();// 获取对象的类型
PropertyDescriptor pd = getPropertyDescriptor(clazz, propertyName);
Method getMethod = pd.getReadMethod();// 从属性描述器中获取 get 方法
Object value = null;
try {
value = getMethod.invoke(clazz, new Object[] {});// 调用方法获取方法的返回值
} catch (Exception e) {
e.printStackTrace();
}
return value;// 返回值
}
public static void main(String args[]){
String field ="author";
String value="hello";
SiteRule st = new SiteRule();
PropertyUtil.setProperty(st, field, value);
System.out.println(st.getAuthor());
}
}
代码中使用的类介绍:
Method类:Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
此类被final 修饰,不能继承,继承和实现了AccessibleObject 和 GenericDeclaration Member.
根据此类可以:invoke 方法 调用该方法。
Field类:是类上面的(对于类属性和普通属性,下面的是一样的),使用get 方法得到本属性的值(对于某一个实例对象或者类对象),注意根据getDeclaredField得到的Field, 对于私有属性 不能直接使用get方法,必须 先 setAccessible()才能使用get访问值,public等其他的可以使用。
使用Field 对象赋值:set(对象,值)
功能:得到对象在此字段上的值等。
PropertyDescriptor类:PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性
class类: class 常用方法: getDeclaredField("") 可以得到单一属性 任何权限都可以,得不到父类的属性(就是本类代码中编写的东西)
getField(“”)只能是公有的。可以得到父类的属性(就是本类含有的属性)
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
使用class 创建对象, c。newInstance() 这是必须调用无参构造方法。调用其他构造方法使用:
a) 通过Class类中的getConstructors()取得本类中的全部构造方法。
b) 向构造方法中传递一个对象数组进去,里面包含了构造方法中所需的各个参数。
c) 之后通过Constructor实例化对象
功能:可以强制类型转化为子类,得到类中的注释,得到类加载器,得到类中所有的成员的类,
得到类中的方法,得到所有的属性,得到方法等。
Constructor类:构造方法类
Modifier类:修饰符的类
根据class 取得对应的方法:getMethod("方法名")
如何取得带有参数的方法:getMethod("方法名",参数类型.class,.....);