Java通过PropertyDescriptor反射调用set和get方法

本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下

第一段:

package com.zhoushun;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.beans.PropertyDescriptor; 

public class PropertyUtil {
 @SuppressWarnings("unchecked")
 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;
 } 

 @SuppressWarnings("unchecked")
 public static void setProperty(Object obj,String propertyName,Object value){
  Class clazz = obj.getClass();//获取对象的类型
  PropertyDescriptor pd = getPropertyDescriptor(clazz,propertyName);//获取 clazz 类型中的 propertyName 的属性描述器
  Method setMethod = pd.getWriteMethod();//从属性描述器中获取 set 方法
  try {
   setMethod.invoke(obj, new Object[]{value});//调用 set 方法将传入的value值保存属性中去
  }catch (Exception e){
   e.printStackTrace();
  }
 } 

 @SuppressWarnings("unchecked")
 public static Object getProperty(Object obj, String propertyName){
  Class clazz = obj.getClass();//获取对象的类型
  PropertyDescriptor pd = getPropertyDescriptor(clazz,propertyName);//获取 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 boolean setValue(Object objSet, Object objGet)
  throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, IntrospectionException
 {
  boolean flag = true;
  Field fields[] = objSet.getClass().getDeclaredFields();
  String value = "";
  String fieldNameGet = "";
  List list = new ArrayList();
  Field afield[];
  int j = (afield = fields).length;
  for(int i = 0; i < j; i++)
  {
   Field field = afield[i];
   String fieldName = field.getName();
   fieldNameGet = xmlToModel(fieldName);
   if(!"error".equals(fieldNameGet))
   {
    PropertyDescriptor pd = new PropertyDescriptor(fieldNameGet, objGet.getClass());
    Method getMethod = pd.getReadMethod();
    value = String.valueOf(getMethod.invoke(objGet, new Object[0]));
    boolean checkResult = returnMessage.checkValue(value, fieldNameGet);
    if(checkResult)
    {
     PropertyDescriptor pd1 = new PropertyDescriptor(fieldName, objSet.getClass());
     Method setMethod = pd1.getWriteMethod();
     setMethod.invoke(objSet, new Object[] {
      field.getType().getConstructor(new Class[] {
       java/lang/String
      }).newInstance(new Object[] {
       value
      })
     });
    } else
    {
     flag = checkResult;
    }
   }
  } 

  return flag;
 } 

第三段:

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest { 

 public static void main(String[] args) throws Exception {
 Class clazz = Class.forName("TaskProvidePropsList");//这里的类名是全名。。有包的话要加上包名
 Object obj = clazz.newInstance();
 Field[] fields = clazz.getDeclaredFields();
 //写数据
 for(Field f : fields) {
 PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
 Method wM = pd.getWriteMethod();//获得写方法
 wM.invoke(obj, 2);//因为知道是int类型的属性,所以传个int过去就是了。。实际情况中需要判断下他的参数类型
 }
 //读数据
 for(Field f : fields) {
 PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
 Method rM = pd.getReadMethod();//获得读方法
 Integer num = (Integer) rM.invoke(obj);//因为知道是int类型的属性,所以转换成integer就是了。。也可以不转换直接打印
 System.out.println(num);
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java中实现list或set转map的方法

    java中实现list或set转map的方法 在开发中我们有时需要将list或set转换为map(比如对象属性中的唯一键作为map的key,对象作为map的value),一般的想法就是new一个map,然后把list或set中的值一个个push到map中. 类似下面的代码: List<String> stringList = Lists.newArrayList("t1", "t2", "t3"); Map<String, St

  • 详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for循环,需要注意的是,使用增强for循环无法访问数组下标值,对于集合的遍历其内部采用的也是Iterator的相关方法.如果只做简单遍历读取,增强for循环确实减轻不少的代码量. 集合概念: 1.作用:用于存放对象 2.相当于一个容器,里面包含着一组对象,其中的每个对象作为集合的一个元素出现 3.jav

  • Java中的HashSet详解和使用示例_动力节点Java学院整理

    第1部分 HashSet介绍 HashSet 简介 HashSet 是一个没有重复元素的集合. 它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素. HashSet是非同步的.如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步.这通常是通过对自然封装该 set 的对象执行同步操作来完成的.如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来"包装" set.

  • Java中List Set和Map之间的区别_动力节点Java学院整理

    Java集合的主要分为三种类型: • Set(集) • List(列表) • Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 有人想有可以自动扩展的数组,所以有了List 有的

  • 利用Java Set 去除重复object的方法

    实例如下: import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 编写者:CP * <br />类描述:set集合针对String 类型和8大基础数据类型 过滤掉重复数据,如果存放的是其他类型对象,则需要重写hashCode方法和equals方法,当equals 比较相等时,则会去比较hashCode值 hashCode的值 如果一致的话,

  • Java 从Set里面取出有序的记录详解及实例

    Java 从Set里面取出有序的记录详解及实例 Set里面的记录是无序的,如果想使用Set,然后又想里面的记录是有序的,就可以使用TreeSet,而不是HashSet,在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,TreeSet在进行排序的时候就是通过比较它们的Comparable接口的实现! 下面是HashSet的无序和TreeSet的有序的比较: Test类: import java.util.HashSet; import java.util.Iterato

  • Java通过PropertyDescriptor反射调用set和get方法

    本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下 第一段: package com.zhoushun; import java.lang.reflect.Method; import java.lang.reflect.Field; import java.beans.PropertyDescriptor; public class PropertyUtil { @SuppressWarnings("unchecked") p

  • java中利用反射调用另一类的private方法的简单实例

    我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectDemo {

  • 应用Java泛型和反射导出CSV文件的方法

    本文实例讲述了应用Java泛型和反射导出CSV文件的方法.分享给大家供大家参考.具体如下: 项目中有需求要把数据导出为CSV文件,因为不同的类有不同的属性,为了代码简单,应用Java的泛型和反射,写了一个函数,完成导出功能. 复制代码 代码如下: public <T> void saveFile(List<T> list, String outFile) throws IOException {         if (list == null || list.isEmpty())

  • Java程序中实现调用Python脚本的方法详解

    本文实例讲述了Java程序中实现调用Python脚本的方法.分享给大家供大家参考,具体如下: 在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法. 1.在Eclipse中新建Maven工程: 2.pom.xml文件中添加如下依赖包之后update maven工程: <dependency> <groupId>org.python</groupId> <artifactId>jython</ar

  • 反射调用private方法实践(php、java)

    单测中有个普遍性的问题,被侧类中的private方法无法直接调用.小拽在处理过程中通过反射改变方法权限,进行单测,分享一下,直接上代码. 简单被测试类 生成一个简单的被测试类,只有个private方法. 复制代码 代码如下: <?php/** * 崔小涣单测的基本模板. * * @author cuihuan * @date 2015/11/12 22:15:31 * @version $Revision:1.0$ **/class MyClass {/** * 私有方法 * * @param

  • java 反射调用Service导致Spring注入Dao失效的解决方案

    目录 java 反射调用Service导致Spring注入Dao失效 问题发生背景: 1.错误方法:通过反射执行service的方法 2.解决方法:通过获取Spring容器取得对象 反射调用导致Spring特性失效 1.抛出问题 1.1.编写TestAspectController类 1.2.编写ModuleService类 1.3.编写TestKey注解 1.4.编写TestAspectService 1.5.编写TestAspect切面 2.解决问题 2.1.编写SpringContextU

  • 利用java反射机制调用类的私有方法(推荐)

    试想一下,如果你可以轻易地调用一个类的私有方法,那么是不是说你的封装都失效了?最近在看java的反射机制,发现居然可以利用java的反射机制去调用其他类的私有方法,至于这能干什么,那就见人见智了.. 我写的一段简易实例代码如下: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @author thomaslwq * @version 创建时间:Sep 4, 201

  • Java的反射机制---动态调用对象的简单方法

    唉!我还真是在面试中学习新东东啊,一个公司刚刚给了个测试,不过我很奇怪的是为什么web developer的职位居然考java的反射机制题,不过学习研究一下反射机制对我来说是件好事啦! 先说说什么是java反射机制吧,在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这 种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.主要功能:在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对 象:在运行时判断任意一个

  • 利用java反射机制实现自动调用类的简单方法

    1. 新建TestServlet类 package com.yanek.test; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.ht

  • Java 反射调用静态方法的简单实例

    以往都是使用反射调用实例方法,那么反射如何调用静态方法呢?看下面的例子 Class<?> threadClazz = Class.forName("java.lang.Math"); Method method = threadClazz.getMethod("abs", long.class); System.out.println(method.invoke(null, -10000l)); 只需要将invoke方法的第一个参数设为null即可! 以

随机推荐