探索与发现

研究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 蜘蛛 阅读(3344) 评论(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]);
}
}  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: