Java反射机制

假设一个情形,两个程序愿协同编写一段程序,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)
        {

        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值