本来不是很懂,看了很多文章解析,感觉貌似有点懂了。
记下备忘。待后来回头查看,以便更正。
Java反射机制是:在程序编译以后,运行过程中,实时获取新的类名,并且可以获知新类的方法、域和构造器,进而可以对新类进行newInstance()—–类加载(在其它的文章中看到的:与类实例化new不同,new实例化出的对象可以有更多的操作,暂时不清楚多了哪些)。这里可以看出,这个类加载是程序运行过程中的实时操作,所以会对虚拟机的性能产生一定的影响。
Java反射机制的优势在:
1、进一步的解耦:
(1)程序员的工作中:
一个JavaEE工程,由许多人同时做,此时,每个人写的功能是相互独立的,但是代码是相互牵连的。这样的做法,每个人写的程序到最后,要不就重复开发,要不就是太散漫太难懂。此时如果通过写接口的方式,手下每个程序员实现接口,这样就不会出现上述问题。而这时,程序员A需要B编写的类的功能,就利用Java反射机制,获得所有想要的。
(2)程序的工作
比如工厂模式,完全可以把工程分为Java代码和XML代码,这样通过配置XML,Java代码就可以实时的从XML中获取想要的。
下面是简单的片断:
1、
在JDBC中的类加载
Class.forName(‘com.mysql.jdbc.Driver.class’).newInstance();
通过这个名字来搜索。
而且我们可以看到,这个引号内的内容是可以替换的,也就是说,该类在编译的时候,并不用获知括号中的类并编译。
2、获得类的域、方法、构造器(通过静态块)
static
{
Scanner sc=new Scanner(System.in);
String cln=sc.nextLine();
try {
Class cl=Class.forName(cln);//运行时获取要分析的类名
Method[] mt=cl.getDeclaredMethods();//将所有方法存到方法Method数组里
Field[] fd=cl.getDeclaredFields();//域数组
Constructor[] ct=cl.getDeclaredConstructors();//构造器数组
//………………………………………………………………………………………………………………………………………………………………………………………………………………
//............以下代码段,可打印出该类的所有域、方法、构造器
for(Method tem:mt)
{
System.out.println(tem.toString());
}
for(Field tem:fd)
{
System.out.println(tem.toString());
}
for(Constructor tem:ct)
{
System.out.println(tem.toString());
}
//………………………………………………………………………………结束………………………………………………………………………………………………………………………………
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}