反射机制简单实例

来源:互联网 发布:知乎 zun的地位 编辑:程序博客网 时间:2024/05/16 14:06

Java反射机制的一个简单实例  

2007-05-14 17:25:03|  分类:JAVA技术 |字号 订阅

Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性。
运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实例,下面的一个例子演示了这一实现。

--|Base.java //抽象基类
  |Son1.java //基类扩展1
  |Son2.java //基类扩展2
  |Util.java

1)Base.java 抽象基类只是一个定义

package com.java.reflect;

publicabstractclass Base {

}

2)Son1.java /Son2.java 是已经实现的JavaBean

 package com.java.reflect;

public class Son1 extends Base {
    private int id;
    private String name;
   
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
   
    public void son1Method(String s)
    {
        System.out.println(s);
    }
}

3)Son2.java

package com.java.reflect;

public class Son2 extends Base {
   
    private int id;
    private double salary;
   
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
}

3)TestReflect.java演示了如何根据指定的类名,类字段名和所对应的数据,得到一个类的实例

package com.java.reflect;

import java.lang.reflect.Method;

public class TestReflect {
    //此方法的最大好处是没有类名Son1,Son2 可以通过参数来指定,程序里面根本不用出现Son1,Son2
    public static Base getBean(String beanName,String fieldSetter,String paraValue)
    {
        Base base = null;
       
        try
        {
            Class cls = Class.forName(beanName);
            base = (Base)cls.newInstance();
           
            Class[] paraTypes = new Class[]{String.class};
           
            Method method = cls.getMethod(fieldSetter, paraTypes);
            String[] paraValues = new String[]{paraValue};
           
            method.invoke(base, paraValues);
        }
        catch(Throwable e)
        {
            System.err.println(e);
        }
       
        return base;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        Son1 son1 = (Son1)TestReflect.getBean("com.java.reflect.Son1", "setName", "I am Nina!");

        System.out.println("son1.getName():"+son1.getName());
    }
}

//调用结果:
//son1.getName() :I am Nina!

 

Java反射 getFields()和getDeclaredFields()的区别

getFields()获得某个类的所有的公共(public)的字段,包括父类。 getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段。 同样类似的还有getConstructors()和getDeclaredConstructors(),getMethods()和getDeclaredMethods()。


原创粉丝点击