Java反射知识总结

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一、Class类的使用</span>

任何一个类都是Class类的实例对象,例如有Foo类,它有一个实例对象foo1,Foo这个类也是一个实例对象,即为Class类的实例对象,有三种表示方法:

  • Class c1 = Foo.class 实际告诉我们任何一个类都有一个隐含的静态成员
  • Class c2 = foo1.getClass() 这种方法需已知该类的对象
  • Class c3 = null;  c3 = Class.forName("com.dyl.reflect.Foo")
不管c1,c2,c3都代表了Foo的类类型,一个类只可能是Class类的一个实例对象,我们完全可以通过类的类类型创建该类的对象:
Foo foo = (Foo) c1.newInstance();需要有无参数的构造方法
二、动态加载类
Class.forName("类的全称") 不仅表示了类的类类型,还代表了动态加载类,编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
我们用txt写一个Office类
class office{
	public static void main(String[] args)
	{
		if("word".equals(args[0]))
		{
			Word w = new Word();
			w.start();
		}
		if("Excel".equals(args[0]))
		{
			Excel e = new Excel();
			e.start();
		}
	}


}
通过javac命令编译,会报错,告诉我们类找不到,方法也找不到:

这时候我们理所当然会认为这个类是错误的,但是我们细想一下,main方法中是一个分支结构,Word类一定用吗?Excel类一定用吗?都不一定,甚至可能都不用,我们在新建一个Word类:
class Word{
	public static void start(){
	System.out.println("word");
	}
}
先编译Word类,在编译Office类:

依然报有两个错,因为虽然有了Word类,但是Excel还是缺乏,因为咱们用的是new创建对象,是静态加载类,在编译时刻就要加载所有的可能使用到的类,但我们想做到的是想用哪个类就加载哪个类,在运行的时刻加载,这时候就可以通过动态加载类来解决这个问题:
创建一个OfficeAble接口:
interface OfficeAble{
	public void start();
}
Word类实现该接口
<pre name="code" class="java">class Word implements OfficeAble{
	public  void start(){
	System.out.println("word");
	}
}


 写一个优化的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();
		}
	}
}

这样就实现了类的动态加载,一般功能性能性的类提倡用动态加载方式,这样就可以用那部分就实现那部分就行了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值