反射机制

来源:互联网 发布:配置windows请勿关机 编辑:程序博客网 时间:2024/05/03 10:40

先看下面的例子  里面有一个Fruit接口,而其他的水果都通过这个接口去实现生长和摘得过程,然后最后调用一个工厂进行生产。

 

interface Fruit
{
 // 生长
 public void grow() ;
 // 采摘
 public void pick() ;
}
class Apple implements Fruit
{
 public void grow()
 {
  System.out.println("苹果在生长。。。 ") ;
 }
 public void pick()
 {
  System.out.println("摘苹果。。。") ;
 }
};
class Orange implements Fruit
{
 public void grow()
 {
  System.out.println("橘子在生长。。。 ") ;
 }
 public void pick()
 {
  System.out.println("摘橘子。。。") ;
 }
};
class Cherry implements Fruit
{
 public void grow()
 {
  System.out.println("樱桃在生长。。。 ") ;
 }
 public void pick()
 {
  System.out.println("摘樱桃。。。") ;
 }
};

class Banana implements Fruit
{
 public void grow()
 {
  System.out.println("香蕉在生长。。。 ") ;
 }
 public void pick()
 {
  System.out.println("摘香蕉。。。") ;
 }
};

class Factory
{
 public static Fruit getFruitInstance(String type)
 {
  Fruit f = null ;
  // 通过Class类完成
  try
  {
   f = (Fruit)Class.forName("org.lxh.demo."+type).newInstance() ;
  }
  catch (Exception e)
  {
  }
  return f ;
 }
};

在看看主函数:

ublic class FactoryDemo04
{
 public static void main(String args[])
 {
  if(args.length==0)
  {
   System.out.println("必须输入一个要使用的名称") ;
   System.exit(1) ;
  }
  Fruit f = Factory.getFruitInstance(args[0]) ;
  if(f!=null)
  {
   f.grow() ;
   f.pick() ;
  }
  else
  {
   System.out.println("没有发现这个类型。") ;
  }
 }
};

工厂中通过class类的放射机制,通过主函数传进来的参数,进行实例化具体的水果

forNamepublic static Class<?> forName(String className) throws ClassNotFoundException返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于:
Class.forName(className, true, currentLoader)
其中 currentLoader 表示当前类的定义类加载器。

可以看出程序就是通过forname放射出输入的类的  然后通过newInstance方法得到这个类的实例

newInstancepublic T newInstance() throws InstantiationException, IllegalAccessException创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。

注意,此方法传播 null 构造方法所抛出的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译时的异常检查,而在其他情况下编译器都会执行该检查。 Constructor.newInstance 方法将该构造方法所抛出的任何异常包装在一个(已检查的)InvocationTargetException 中,从而避免了这一问题。

 

返回: 此对象所表示的类的一个新分配的实例。 抛出: IllegalAccessException - 如果该类或其 null 构造方法是不可访问的。 InstantiationException - 如果此 Class 表示一个抽象类、接口、数组类、基本类型或 void; 或者该类没有 null 构造方法; 或者由于其他某种原因导致实例化失败。 ExceptionInInitializerError - 如果该方法引发的初始化失败。 SecurityException - 如果存在安全管理器 s,并满足下列任一条件:
  • 调用 s.checkMemberAccess(this, Member.PUBLIC) 拒绝创建该类的新实例
  • 调用者的类加载器不同于也不是当前类的类加载器的一个祖先,并且对 s.checkPackageAccess() 的调用拒绝访问该类的包

 从这里可以看出放射的好处 

原创粉丝点击