求解:Java简单工厂模式之反射实现的疑问? 使用反射实现有什么优点?为什么反射实现时工厂类的Field必须为public? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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,为什么会这样啊? 谁说的啊,你用的方法是获取public的而已,如果你需要获取非public的field的可以使用getDeclaredField 看了下文档,确实如此:Field getField(String name) :返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 Field getDeclaredField(String name) :返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 反射的用途很广,其特点就是因为能在运行中获取类的属性、方法、构造器信息比如:java的动态代理 俺也是刚刚不久才找了 一些关于java的反射的资料看了下下,因为在外包公司,很少涉及到这方面的,但是我想拓宽一下自己的知识为以后挖口井。反射如5楼筒靴说的那样,但是我需要补充一点,反射不仅仅是在运行中获取类的一些信息,还可以调用其方法,使用invoke方法。仅一点补充。 泛型化的异常有什么意义? GUI菜鸟问题 Swing中设置鼠标为等待状态后,如何使得鼠标和键盘无效? 我是一个初学者,我很想学JAVA,请教:!!! 请教二进制的问题 新手问题 一个数据库取出值的问题 用jdbc连接数据库,产生的编译错误 如何输出字符串到一个文件中? 在applet中如何监听vrml上的鼠标点击事件!!! static 问题 匿名内部类可不可以继续继承其他的类
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,为什么会这样啊?
Field getField(String name) :返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field getDeclaredField(String name) :返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
比如:java的动态代理
反射如5楼筒靴说的那样,但是我需要补充一点,反射不仅仅是在运行中获取类的一些信息,还可以调用其方法,使用invoke方法。
仅一点补充。