假设一个情形,两个程序愿协同编写一段程序,A程序员负责输出一段helloworld,B程序员负责把这段代码输出到窗体;那么问题来了,假如A程序员一直没有把helloworld写出来,B程序员是不是一直要等着?有没有什么办法可以让A,B程序员同时工作呢?恩,这就是我们反射机制需要干的事。
- 反射机制就是,就是能够在运行时获得自身信息,在java中我们只要给定类的名字,就可以通过反射机制获得该类的所有信息。比如我们在学习jdbc时经常会用到的Class.forName(“com.mysql.jdbc.Driver.class”).newInstance();
- 反射机制是动态编译的,那么什么叫动态编译,什么是静态编译呢?静态编译就是编译时确定对象,动态编译就是运行时在确定对象,动态编译有什么好处呢?举个例子,对于一个大型软件系统,我们不可能在一开始就将所有的功能做的很完善,我们在日后修改功能或者是添加新的功能时,我们不可能要求用户卸载应用重新使用编译后的新版本,此时我们就需要动态编译,在运行时编译我们的类。
- 缺点是反射机制比较耗时
我们现在来看看调用反射机制的基本方法
public class reflector {
//定义一个类供例子使用
public class Test {
private int f(Object p, int x) throws NullPointerException {
if (p == null)
throw new NullPointerException();
return x;
}
}
public static void main(String args[])
{
try {
//获取类名,有三种加载方式,这里只是其中一种
Class test1=Class.forName("Test");
//获取类中的方法
Method methodlist[]=test1.getDeclaredMethods();
for (int i=0;i<methodlist.length;i++)
{
Method m=methodlist[i];
System.out.println("name="+m.getName());
//获得每个方法的类型
Class pvec[]=m.getParameterTypes();
for (int j=0;j<pvec.length;j++)
{
System.out.println("param #"+j+" "+pvec[j]);
}
}
}
catch (Throwable e)
{
e.printStackTrace();
}
}
}
public class reflectconstructor {
public class Constructor1{
public Constructor1()
{
}
public Constructor1(int a,int b)
{
System.out.println("a="+a+"b="+b);
}
}
public static void main(String[]args)
{
//反射机制创建新对象
try{
Class test=Class.forName("Construct1");
Class partypes[]=new Class[2];
partypes[0]=Integer.TYPE;
partypes[1]=Integer.TYPE;
Constructor constructor=test.getConstructor(partypes);
Object arglist[]=new Object[2];
arglist[0]=new Integer(1);
arglist[1]=new Integer(2);
Object object=constructor.newInstance(arglist);
}catch (Throwable e)
{
}
}