java高级开发学习之--反射机制(1)

  1. 类本身就是一个对象,类是java.lang.Class类的实例对象。
  2. 任何一个类都是Class的实例对象,这个实例对象有三种表示方式
    Foo foo1 = new Foo();

    第一种: Class c1 = Foo.class;
    第二种: Class c2 = foo1.getClass();
    System.out.println(c1 == c2); (结果是 true)
    第三种:Class c3 = null;
    try {
    c3 = Class.forName("com.tr.lmh_sb.Foo");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    System.out.println(c2==c3);
    //可以通过类的类类型创建该类的对象实例
    try {
    Foo f = (Foo)c1.newInstance();//创建对象的前提是 得有无参数的构造方法
    f.print();
    } catch (InstantiationException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }

例子:Office类

class Office 
{
    public static void main(String[] args) 
    {
        //new 创建对象其实是静态加载类,在编译时刻就需要加载所有的可能使用到的类
        //这个类是有问题的,现在没有Word类Excel类,所以编译肯定不能通过,而且Word、Excel其中只要有一个有问题,整个程序就不能运行。
        //解决方案:通过动态加载类可以解决该问题
        if("Word".equals(args[0])){
            Word w = new Word();
            w.start();
        }
        if("Excel".equals(args[0])){
            Excel e = new Excel();
            e.start();
        }
        System.out.println("Hello World!");
    }
}

解决方案:OfficeBetter代替Office

class OfficeBetter {
    public static void main(String[] args) 
    {
        try{

            //动态加载类,在运行时刻加载
            Class c = Class.forName(args[0]);
            //通过类类型 创建该类的对象
            OfficeAble oa = (OfficeAble)c.newInstance();
            oa.start();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

class Word implements OfficeAble {
    public void start()
    {
        System.out.println("Word start..");
    }
}
interface OfficeAble {
    public void start();
}

总结:1.功能性的类尽量使用动态加载,方便功能的添加删除。
2.提高自己的设计思想.

全部评论

相关推荐

扭转乾坤_:现在企业都是学华为,一直通过丢池子里,最后捞
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务