java反射机制 调用get set 方法

本文介绍了一种利用Java反射API调用类中的getter和setter方法的方式,并提供了具体的实现代码,展示了如何通过反射机制获取并设置对象属性值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用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,.....);

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值