探索與發現

          研究java技術

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            83 隨筆 :: 0 文章 :: 109 評論 :: 0 Trackbacks

          對于面向接口編程的項目免不了要一反射相接觸,動態得到實例:
          public interface a {
          ?public void sayHello();
          }
          ---------------------------
          第一種情況是當
          aImpl實現類為默認的構造方法:
          根據類名aImpl動態得到實例
          Class c=Class.forName("aImpl");
          a instance=(a)c.newInstance();
          a.sayHello();
          ------------
          第二種情況當
          aImpl為帶參數的構造方法時:
          Class o=Class.forName("aImpl");//aImpl為要實例化的例名,可以從配置文件當中獲取
          ???Constructor cous = null;
          ???cous=o.getConstructor(new Class[]{String.class});//構造器的參數類型
          ???a ao=(a) cous.newInstance(new Object[]{"xxx"});//"xxx為傳入的參數值
          ???ao.sayHello();
          第三種就是構造器為私有的時候,我們通過方法獲取實例getInstance()(自己定的)
          Class o=Class.forName("aImpl");
          ???Method method=o.getMethod("getInstance",new Class[]{String.class});
          //getInstance為返回為aImpl實例的方法名
          ??? a ao=(a) method.invoke(null,new Object[]{"xxx"});//注意了前面的參數為null,是有
          //條件的,就是要求getInstance為static類型的,我想大家都會這樣設計的
          ?????? ao.sayHello();
          做連接池的話,一種方式就是使用動態代理類,當Connection調用close()方法時,我們可以利用方法攔截器,在調用close方法的時候把連接放到緩存里面去,供以后再次利用..
          a ao=(a)Proxy.newProxyInstance(aImpl.class.getClassLoader(),aImpl.class.getInterfaces(),
          ?????new InvocationHandler()
          ?????{

          ??????public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          ???????Object re=null;
          ???????System.out.println("before--------"+method.getName());
          //在這里我們添加自己的一些處理方法,如把連接放到緩存去撒!
          ???????//re=method.invoke(new aImpl(),args);
          ???????return re;
          ??????}
          ????
          ?????});
          ???ao.sayHello();

          posted on 2006-07-15 22:00 蜘蛛 閱讀(3353) 評論(1)  編輯  收藏 所屬分類: java

          評論

          # re: java利用反射得到實例,和代理類proxy 2007-09-25 06:30 javazhai
          import org.eclipse.swt.SWT;
          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Event;
          import org.eclipse.swt.widgets.Listener;
          import org.eclipse.swt.widgets.Shell;
          import org.eclipse.swt.widgets.Tree;
          import org.eclipse.swt.widgets.TreeItem;

          public class Snippet61 {

          public static void main(String[] args) {
          Display display = new Display();
          Shell shell = new Shell(display);
          final Tree tree = new Tree(shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
          for (int i = 0; i < 4; i++) {
          TreeItem item0 = new TreeItem(tree, 0);
          item0.setText("Item " + i);
          for (int j = 0; j < 4; j++) {
          TreeItem item1 = new TreeItem(item0, 0);
          item1.setText("SubItem " + i + " " + j);
          for (int k = 0; k < 4; k++) {
          TreeItem item2 = new TreeItem(item1, 0);
          item2.setText("SubItem " + i + " " + j + " " + k);
          }
          }
          }
          tree.setBounds(0, 0, 100, 100);
          tree.addListener(SWT.Selection, new Listener() {
          public void handleEvent(Event e) {
          String string = "";
          TreeItem[] selection = tree.getSelection();
          if(selection!=null&&selection.length>0)
          expandOrCollapse(selection[0]);
          for (int i = 0; i < selection.length; i++)
          string += selection[i] + " ";
          System.out.println("Selection={" + string + "}");
          }
          });
          tree.addListener(SWT.DefaultSelection, new Listener() {
          public void handleEvent(Event e) {
          String string = "";
          TreeItem[] selection = tree.getSelection();
          for (int i = 0; i < selection.length; i++)
          string += selection[i] + " ";
          System.out.println("DefaultSelection={" + string + "}");
          }
          });
          tree.addListener(SWT.Expand, new Listener() {
          public void handleEvent(Event e) {
          System.out.println("Expand={" + e.item + "}");
          }
          });
          tree.addListener(SWT.Collapse, new Listener() {
          public void handleEvent(Event e) {
          System.out.println("Collapse={" + e.item + "}");
          }
          });
          tree.getItems()[0].setExpanded(true);
          tree.getItems()[0].getItems()[0].setExpanded(true);
          tree.getItems()[0].getItems()[0].setText("ttttt");
          tree.setSelection(tree.getItems()[0].getItems()[1]);
          shell.pack();
          shell.open();
          while (!shell.isDisposed()) {
          if (!display.readAndDispatch())
          display.sleep();
          }
          display.dispose();
          }

          public static void expandOrCollapse(TreeItem treeItem) {
          boolean isExpanded=treeItem.getExpanded();
          treeItem.setExpanded(!isExpanded);
          // TreeItem[] selection = treeItem.getItems();
          // if (treeItem != null && selection.length > 0)
          // expandOrCollapse(selection[0]);
          }
          }  回復  更多評論
            

          主站蜘蛛池模板: 大关县| 新丰县| 壤塘县| 泰宁县| 隆安县| 永州市| 铜陵市| 广平县| 凭祥市| 西城区| 应城市| 久治县| 本溪市| 福鼎市| 潢川县| 宁河县| 烟台市| 盐亭县| 石河子市| 沛县| 蕉岭县| 揭西县| 北京市| 哈巴河县| 马边| 东方市| 登封市| 昆山市| 柳林县| 霍林郭勒市| 洞口县| 禹城市| 东乡县| 巴林左旗| 台湾省| 塔河县| 佛山市| 育儿| 广东省| 湟中县| 博兴县|