使用反射实现有什么优点?
为什么反射实现时工厂类的Field必须为public?

解决方案 »

  1.   


    package simplefactory;import java.lang.reflect.Field;interface Bank{
    void encrypt();
    }class CCB_Bank implements Bank{
    public void encrypt(){
    System.out.println("CCB encrypt!");
    }
    }class BOC_Bank implements Bank{
    public void encrypt() {
    System.out.println("BOC encrypt!");
    }
    }public class BankFactory {
    public static final String CCB = "simplefactory.CCB_Bank";
    private static final String BOC = "simplefactory.BOC_Bank"; //为什么不能是private?
    private Bank bank;
    public Bank getInstance(String BankID){
    try {
    Field field = BankFactory.class.getField(BankID);
    String name = (String)field.get(this);
    bank = (Bank)Class.forName(name).newInstance();
    } catch (Exception e) {
    e.printStackTrace();

    return bank;
    }
    public static void main(String[] args){
    Bank ccb = new BankFactory().getInstance("CCB");
    ccb.encrypt();
    // Bank boc = new BankFactory().getInstance("BOC"); // 这行报错???
    // boc.encrypt();
    }
    }运行Bank boc = new BankFactory().getInstance("BOC")会报错,因为BOC是private,为什么会这样啊?
      

  2.   

    谁说的啊,你用的方法是获取public的而已,如果你需要获取非public的field的可以使用getDeclaredField
      

  3.   

    看了下文档,确实如此:
    Field getField(String name) :返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 
    Field getDeclaredField(String name) :返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 
      

  4.   

    反射的用途很广,其特点就是因为能在运行中获取类的属性、方法、构造器信息
    比如:java的动态代理
      

  5.   

    俺也是刚刚不久才找了 一些关于java的反射的资料看了下下,因为在外包公司,很少涉及到这方面的,但是我想拓宽一下自己的知识为以后挖口井。
    反射如5楼筒靴说的那样,但是我需要补充一点,反射不仅仅是在运行中获取类的一些信息,还可以调用其方法,使用invoke方法。
    仅一点补充。