Java反射机制--肤浅认知

本文深入解析Java反射机制,包括其工作原理、如何在运行时获取类的信息及实例化对象等。探讨了反射机制带来的解耦优势及其应用场景,例如在工厂模式和多人协作项目中的运用。

本来不是很懂,看了很多文章解析,感觉貌似有点懂了。
记下备忘。待后来回头查看,以便更正。

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();
        }
    }
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值