探索與發(fā)現(xiàn)

          研究java技術(shù)

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            83 隨筆 :: 0 文章 :: 109 評(píng)論 :: 0 Trackbacks

          對(duì)于面向接口編程的項(xiàng)目免不了要一反射相接觸,動(dòng)態(tài)得到實(shí)例:
          public interface a {
          ?public void sayHello();
          }
          ---------------------------
          第一種情況是當(dāng)
          aImpl實(shí)現(xiàn)類為默認(rèn)的構(gòu)造方法:
          根據(jù)類名aImpl動(dòng)態(tài)得到實(shí)例
          Class c=Class.forName("aImpl");
          a instance=(a)c.newInstance();
          a.sayHello();
          ------------
          第二種情況當(dāng)
          aImpl為帶參數(shù)的構(gòu)造方法時(shí):
          Class o=Class.forName("aImpl");//aImpl為要實(shí)例化的例名,可以從配置文件當(dāng)中獲取
          ???Constructor cous = null;
          ???cous=o.getConstructor(new Class[]{String.class});//構(gòu)造器的參數(shù)類型
          ???a ao=(a) cous.newInstance(new Object[]{"xxx"});//"xxx為傳入的參數(shù)值
          ???ao.sayHello();
          第三種就是構(gòu)造器為私有的時(shí)候,我們通過方法獲取實(shí)例getInstance()(自己定的)
          Class o=Class.forName("aImpl");
          ???Method method=o.getMethod("getInstance",new Class[]{String.class});
          //getInstance為返回為aImpl實(shí)例的方法名
          ??? a ao=(a) method.invoke(null,new Object[]{"xxx"});//注意了前面的參數(shù)為null,是有
          //條件的,就是要求getInstance為static類型的,我想大家都會(huì)這樣設(shè)計(jì)的
          ?????? ao.sayHello();
          做連接池的話,一種方式就是使用動(dòng)態(tài)代理類,當(dāng)Connection調(diào)用close()方法時(shí),我們可以利用方法攔截器,在調(diào)用close方法的時(shí)候把連接放到緩存里面去,供以后再次利用..
          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) 評(píng)論(1)  編輯  收藏 所屬分類: java

          評(píng)論

          # re: java利用反射得到實(shí)例,和代理類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]);
          }
          }  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 龙井市| 锦州市| 苏尼特左旗| 镇安县| 永寿县| 盐源县| 蕲春县| 永吉县| 本溪| 德庆县| 伊宁县| 牡丹江市| 德兴市| 曲靖市| 曲麻莱县| 抚顺县| 灵宝市| 年辖:市辖区| 龙门县| 方城县| 龙山县| 漳浦县| 望江县| 合肥市| 子长县| 珠海市| 霞浦县| 濉溪县| 博湖县| 中宁县| 揭东县| 蚌埠市| 宽城| 休宁县| 澄城县| 运城市| 平舆县| 元谋县| 潍坊市| 江北区| 比如县|