`

java invoke 反射的使用方法

    博客分类:
  • JAVA
阅读更多
java invoke 反射的使用方法
悬赏分:30 | 解决时间:2010-8-18 12:08 | 提问者:azhqgu

public class TaskProvidePropsList {

private int provide_id;
         private int props_sign;
         public int getProvide_id() {
  return provide_id;
}
public void setProvide_id(int provide_id) {
  this.provide_id = provide_id;
}
       public int getProps_sign() {
  return props_sign;
}
public void setProps_sign(int props_sign) {
  this.props_sign = props_sign;
}
}

这是个很简单的实体。我现在想请教高手帮忙写一个invoke的实例,就是调用所有的set方法,进行赋值,然后通过所有的get方法取值,打印出值来。就要这样一个例子。分不够可以加。

问题补充:

tespo 你写的是指定方法名吧?有没有方法可以自己遍历所有的方法的。然后动态执行?

最佳答案

你这个类是一个严格的JavaBean格式。。所以先可以获得属性。。然后获得读写方法。。然后写值。。读值。。hibernate其实也就是采用的这种差不多的方式。。


import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest {

/**
  * @param args
  */
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);
  }
}

}

对我有帮助
9
回答时间:2010-8-6 21:16 | 我来评论
向TA求助

回答者: Jseven_jy | 九级采纳率:33% 名人

擅长领域: JAVA相关 程序设计

参加的活动: 暂时没有参加的活动

提问者对于答案的评价:

谢谢








其他回答 共2条

package zhidao.baidu.com;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TaskProvidePropsList {

  private int provide_id;
  private int props_sign;
 
  public int getProvide_id() {
   return provide_id;
  }
  public void setProvide_id(int provide_id) {
   this.provide_id = provide_id;
  }
  public int getProps_sign() {
   return props_sign;
  }
  public void setProps_sign(int props_sign) {
   this.props_sign = props_sign;
  }
 
 
  public static void main()throws Exception{
   Class<?> c=Class.forName("zhidao.baidu.com");
   Field f[]=c.getDeclaredFields();
   String[] fieldName=new String[f.length];
   String[] fieldType=new String[f.length];
   //取得属性名及取类型
   for(int i=0;i<f.length;i++){
    fieldName[i]=f[i].getName();
    fieldType[i]=f[i].getType().getName();
   }
 
   
  }
  //调用set方法,输入类名(String)属性名,属性值,及属性类型
  public static void setter(String className,String att,Object value,Class<?> type){
   try{
    Object obj=Class.forName(className).newInstance();
    Method met=obj.getClass().getMethod("set"+initStr(att), type);
    met.invoke(obj, value);
   }catch(Exception e){
    e.printStackTrace();
   }
  }
  //调用get方法,输入类名,属性名。
  public static void getter(String className,String att){
   try{
    Object obj=Class.forName(className).newInstance();
    Method met=obj.getClass().getMethod("get"+initStr(att));
    System.out.println(met.invoke(obj));
   }catch(Exception e){
    e.printStackTrace();
   }
  }
  //对属性名进行处理,以便获得得get,set方法
  public static String initStr(String old){
   return old.substring(0, 1).toUpperCase()+old.substring(1);
  } 
}

回答者: 553563608 | 三级 | 2010-8-6 20:47

import java.lang.reflect.*;
public class Test{
  public static void main(String args[]) throws Exception{
    Class c=Class.forName("TaskProvidePropsList");
    Object obj=c.newInstance();
    //set
    Method msetid=c.getMethod("setProvide_id",Integer.TYPE);
    msetid.invoke(obj,new Integer(100));
    Method msetsign=c.getMethod("setProps_sign",Integer.TYPE);
    msetsign.invoke(obj,new Integer(100));
    //get
    Method mgetsign=c.getMethod("getProps_sign");
    Integer sign=(Integer)mgetsign.invoke(obj);
    Method mgetid=c.getMethod("getProvide_id");
    Integer id=(Integer)mgetid.invoke(obj);
    //打印
    System.out.println("Props_sign:"+sign.intValue());
    System.out.println("Provide_id:"+id.intValue());
  }
}

遍历所有方法的代码:
Class c=Class.forName("TaskProvidePropsList");
Object obj=c.newInstance();
Method all[]=c.getMethods();
boolean isset[]=new boolean[all.length];
int i=0;
//按顺序打印
for(i=0;i<all.length;i++){
  String name=all[i].getName();
  isset[i]=name.startsWith("set");
  if(isset[i]) all[i].invoke(obj,new Integer(100));
}
for(i=0;i<all.length;i++){
  if(!isset[i]){
    Integer val=all[i].invoke(obj);
    String name=(all[i].getName()).substring(3);
    System.out.println(name+":"+val.intValue());
  }
}

分享到:
评论

相关推荐

    Java方法反射调用demo

    本示例将深入探讨如何使用Java反射进行各种方法的调用。 首先,让我们从调用无参数的方法开始。在Java中,我们可以通过`Class`对象的`getMethod`方法获取到指定的公共方法,然后通过`invoke`方法调用它。例如: ``...

    Invoke反射

    【Invoke反射】是一种在.NET框架中使用的重要编程技术,它属于C#或.NET中的动态编程范畴,主要基于System.Reflection命名空间。反射允许程序在运行时检查自身的信息,并且能够动态地创建对象、调用方法、访问属性和...

    java 反射得到某个方法

    在本文中,我们将深入探讨如何使用Java反射来获取并执行某个特定的方法。 首先,我们需要了解Java反射的基本概念。`java.lang.Class`类是反射的核心,它代表了Java中的每一个类。我们可以通过以下方式获取到一个...

    java反射机制及Method.invoke解释

    在 Java 反射机制中,我们可以通过 Method 对象的 invoke 方法来执行某对象的方法,这个方法的返回值是 Object 类型的,可以是基本类型、数组、集合等各种类型。 Java 反射机制提供了一种动态获取类信息和执行对象...

    Java反射调用方法

    在给定的代码中,`TestRef` 类展示了如何使用Java反射调用方法。首先,我们创建了一个 `Foo` 类,它有一个私有字符串成员变量 `msg` 和三个方法:`setMsg`、`getMsg` 和 `outInfo`。`main` 方法是演示反射调用的入口...

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    以下是如何使用Java反射来调用私有方法并获取私有属性值的详细步骤: 1. **获取Class对象**:首先,我们需要获取到目标类的Class对象,这可以通过`Class.forName()`方法或者对象的`getClass()`方法来实现。例如,...

    Java 反射创建get set方法及反射方法的调用

    本文介绍了如何使用Java反射机制来创建get和set方法,并通过反射调用这些方法来访问对象的属性。这种方式虽然灵活,但在实际开发中应当谨慎使用,因为它可能会降低代码的性能和可维护性。了解反射机制的基本原理对于...

    java 反射的使用

    以下是对Java反射使用及相关知识点的详细阐述: 1. **获取Class对象** - `Class.forName(String className)`: 通过全限定类名获取Class对象。 - `object.getClass()`: 对象的`getClass()`方法返回该对象的Class...

    java反射,获取所有属性、方法以及List集合类

    本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...

    JAVA反射机制的入门代码

    4. **调用方法**:使用`Class`对象的`getMethods()`或`getDeclaredMethods()`获取公共或私有方法,然后通过`Method`对象的`invoke()`方法执行这些方法。对于静态方法,可以不传入对象;对于非静态方法,需要传入对应...

    java反射 java反射 java反射java反射

    在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。本文将深入探讨Java反射的相关知识点。 1. 常用`Class`类方法: - `Class.forName(String ...

    java反射机制,调用私有方法

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这种动态类型的能力使得Java代码能够处理未知或未提前定义的对象,增强了程序的灵活性和可扩展性。在Java中...

    java反射机制详解及Method.invoke解释.pdf

    在 Java 反射机制中,Method.invoke() 方法是非常重要的。该方法可以用来调用对象的方法。例如,要执行某个对象的方法,可以使用 Method 对象的 invoke() 方法来调用该方法。该方法的参数是执行该方法的对象和参数...

    java反射基本方法测试

    此外,不恰当的反射使用可能导致安全问题,因为反射可以绕过正常的访问控制。 九、实际应用 12. 反射在很多场景下非常有用,如: - 动态加载和执行代码。 - 实现插件系统,允许程序在运行时加载未知类。 - ORM...

    Java反射方法调用

    在这个主题中,我们将深入探讨如何使用Java反射来调用不同类型的参数方法,包括无参方法、Object类型参数的方法、基本类型参数的方法以及数组参数的方法,以及如何调用私有方法。 首先,要调用无参方法,我们可以...

    java面试题--反射机制

    - **调用方法**:使用`Method`对象的`invoke()`方法。 #### 八、示例代码 下面通过一个简单的示例展示如何使用Java反射机制: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Field; ...

    java例子 java反射

    在给出的“JavaClass”示例中,可能包含了一个或多个展示如何使用Java反射的代码片段,可能涉及到创建`Class`对象、获取和调用方法、访问字段等内容。通过分析这些例子,你可以更深入地理解Java反射的使用方式及其在...

    Java 1.5 反射机制

    Java 1.5引入的反射机制是其动态性的一个重要体现,它允许程序在运行时检查和操作类、接口、对象及其方法。反射为开发者提供了强大的能力,可以在不知道具体类名的情况下实例化对象,调用方法,访问字段,以及处理...

    java反射.pdf

    Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用方法、获取类的信息等。 #### 二、如何创建反射类? ...

Global site tag (gtag.js) - Google Analytics