`
mircle
  • 浏览: 22839 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

通过反射实现统一调用多个类的相似方法(这里是get())

阅读更多

*************************************************************************************************

2007/3/3  星期六

       author: by    Mircle_wang

        title:    reflect

        qq:83529101

     希望对大家有帮助,也欢迎交流 :  共同进步

**************************************************************************************************

src 

    Student

    Teacher            被加载类

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package src;

public class Student {
 private Integer id;

 private String name;

 private Integer age;

 private String email;

 // id
 public void setId(Integer id) {
  this.id = id;

 }

 public Integer getId() {
  return this.id;

 }

 // age
 public void setAge(Integer age) {
  this.age = age;
 }

 public Integer getAge() {
  return age;
 }

 // name
 public void setName(String name) {
  this.name = name;
 }

 public String getName() {
  return name;
 }

 // email
 public void setEmail(String email) {
  this.email = email;
 }

 public String getEmail() {
  return email;
 }

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package src;

public class Teacher {
 private Integer id;

 private String name;

 private Integer age;

 // id

 public void setId(Integer id) {

  this.id = id;
 }

 public Integer getId() {
  return id;
 }

 // name
 public void setName(String name) {
  this.name = name;
 }

 public String getName() {
  return name;
 }

 // age
 public void setAge(Integer age) {
  this.age = age;
 }

 public Integer getAge() {
  return age;
 }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

util

    CallAnyMethod       反射类

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class CallAnyMethod {

 public static void convert(String className, Object classNameobj,
   Object[] para) throws ClassNotFoundException,
   IllegalArgumentException, IllegalAccessException,
   InvocationTargetException {

  Class c = Class.forName(className);

  Method[] methList = c.getDeclaredMethods();
  System.out.println(c.getName());
  for (int i = 0; i < methList.length; i++) {
   // if((methList[i].getName().indexOf("get"))!=-1)
   if (methList[i].getName().startsWith("get")) {
    Object o = methList[i].invoke(classNameobj, para);

    System.out
      .println(methList[i].getName().substring(3) + ":" + o);
   }
  }

 }

 public static void convert(String className, Object classNameobj)
   throws ClassNotFoundException, IllegalArgumentException,
   IllegalAccessException, InvocationTargetException {

  convert(className, classNameobj, null);
 }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

main

    TestRef        验证类

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package main;

import java.lang.reflect.InvocationTargetException;

import src.Student;
import src.Teacher;
import util.CallAnyMethod;

public class TestRef {

 /**
  * @param args
  * @throws InstantiationException
  */
 public static void main(String[] args) throws InstantiationException {
  // TODO Auto-generated method stub
  // student set
  Student stu = new Student();
  stu.setId(1);
  stu.setAge(24);
  stu.setName("张三");
  stu.setEmail("ho@hotmail.com");

  // teacher set
  Teacher tec = new Teacher();

  tec.setId(2);
  tec.setAge(23);
  tec.setName("李笑");

  try {
   CallAnyMethod.convert("src.Student", stu);
   //System.out.println(Thread.currentThread().getName());
   //System.out.println(Class.forName("src.Student").getName());
   
   CallAnyMethod.convert("src.Teacher", tec);

  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

}

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

运行结果:

src.Student
Age:24
Email:ho@hotmail.com
Name:张三
Id:1
src.Teacher
Age:23
Name:李笑
Id:2

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

分享到:
评论
1 楼 mircle 2007-03-06  
刚才有位朋友好像没加上  不好意思 请再加一次 :)  

相关推荐

    java反射机制给实体类相同字段自动赋值实例

    - 在复杂版中,引入了`invokeGetMethod()`方法,该方法用于通过反射调用getter方法获取字段值,这样可以处理非基本类型字段的值获取,因为`Field.get()`只能处理基本类型的值。 - 这个方法可能需要传递额外的参数...

    DWR.xml配置文件说明书(含源码)

    仅仅通过反射方法没有办法知道集合元素中的类型,所以上面的两个converter能将任何集合转换成相对javascript而言有意义的对象.然而没有办法将不同的集合类类型分别采用不同的转换方法.因为没有办法完全自动进行转换,...

    java面试重点总结

    **重载**是指在一个类中定义多个同名方法,但这些方法具有不同的参数列表。 - **重载的特点**: - 参数的数量、类型或顺序不同。 - 方法的返回类型不影响重载。 - 方法名必须相同。 - **重载的作用**: - 提高...

    MSDN_C#编程指南

    - **方法重载**:通过方法签名的不同实现方法重载。 #### 二十六、传递值类型参数 - **值类型参数**:值类型参数按值传递,即在方法中修改参数不会影响原始值。 #### 二十七、传递引用类型参数 - **引用类型参数**...

    java-6个机制.doc

    - **访问私有成员**:即使成员变量或方法是私有的,也可以通过反射机制访问它们。 - **调用方法**:动态调用类的方法。 **4.3 示例代码** ```java import java.lang.reflect.Constructor; import java.lang....

    中创软件公司面试题(答案)

    - **抽象类**:可以包含抽象方法和非抽象方法,作为多个相似类的基类。 4. **异常处理** - **try-catch-finally**:捕获并处理异常,finally块确保关键代码无论是否发生异常都会执行。 - **自定义异常**:通过...

    net学习笔记及其他代码应用

    10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i ; i++) { if((i%2) == 1) { Sum += i ; ...

    OCFSourceCode

    2. Key-Value Coding (KVC):一种间接访问对象属性的技术,无需直接调用set和get方法,方便属性批量赋值和反射操作。 3. Key-Value Observing (KVO):监听对象属性变化,当属性值改变时,会自动通知观察者,实现...

    .NET和JAVA的比较

    而在C#中,一个文件可以包含多个命名空间,且每个命名空间可以包含多个类,这为代码组织提供了更大的灵活性。 **4.3 值类型与引用类型** 在处理值类型时,C#和JAVA采取了不同的策略。C#中,基本类型如int、bool等...

    SimpleJava.pdf

    - **类加载时机**:类在首次主动使用时被加载,例如通过反射调用、实例化、静态字段引用等方式触发。 - **初始化过程**:包括父类初始化、静态块执行、静态变量赋值等步骤。 - **类初始化与类加载的区别**:类加载...

    ruby语法基础教程.pdf

    - **对象:** 是类的实例,可以通过类创建。 - **属性:** 对象的数据成员,用于存储对象的状态。 - **方法:** 对象的行为,用于定义对象的操作。 **3.3 继承** - 继承是面向对象编程的基本特性之一,子类可以从...

    面试宝典总结

    - **实现**: 主要通过`Class`类的`forName()`方法获取类的信息,再通过反射API(如`Constructor`、`Method`等)进行动态操作。 **自定义注解的场景及实现** - **场景**: 标记代码、元数据存储、自动代码生成等。 -...

    C#面试题

    - Property是C#中用于封装类成员变量的机制,它提供了一种安全访问和修改对象数据的方法,通常包括get和set访问器。Property允许我们控制对数据的访问权限,并可以添加额外的逻辑,如验证输入。 - Attribute则是元...

    17_Proxy-Reflect-响应式1

    Reflect不是一个新的概念,而是JavaScript语言的一个内置对象,它提供了与Proxy相关的操作方法,这些方法与Object对象中操作对象的方法相似,但更侧重于表达操作本身,而不是对象的属性。例如,`Reflect....

    Generic in java programming language

    每个泛型类的实例在内存中只有一份,不同的类型参数不会导致多个实例。例如,`List&lt;Integer&gt;`和`List&lt;String&gt;`在运行时都是`List`的实例,只是类型参数不同而已。 ##### 类型转换与instanceof 当涉及到类型转换和`...

    C#编程思想

    类可以实现一个或多个接口,强制执行特定的行为规范。 5. **泛型**:泛型允许我们创建可重用的类型安全的数据结构,如List,T代表任何类型,提高了代码的灵活性和效率。 6. **异常处理**:C#使用try-catch块来捕获...

    Ruby程序设计

    线程允许在同一进程中并行执行多个代码段,通过共享内存和通信机制实现高效的数据交换。进程则在不同的地址空间运行,提供更高的隔离性和安全性,但通信成本较高。多线程和多进程的结合使用,可以充分发挥现代多核...

    java经典面试题

    - 本地方法栈:与虚拟机栈相似,用于本地方法调用。 - 程序计数器:线程私有的,记录当前线程所执行的字节码指令地址。 2. **堆里面的分区**: - Eden:新创建的对象首先分配在这里。 - Survivor:经历了一次或...

    java面试题

    多线程是Java的核心特性之一,允许并发执行多个线程,提高程序效率和响应性。主要通过`Thread`类或实现`Runnable`接口来创建线程。理解线程生命周期、同步机制、线程间通信等是关键。 #### 3. 面向对象的核心概念 ...

    ruby 程序设计

    - **类方法**:使用关键字`self`定义的方法,只能由类调用而不是对象。 ##### §3.6 存取控制 - **访问级别**:Ruby支持公有、私有和保护三种访问级别。 - **示例**:通过`public`、`private`和`protected`关键字...

Global site tag (gtag.js) - Google Analytics