我这样理解反射

我这样理解反射

- 反射是什么?
  反射是java的核心技术点之一,也是诸多java框架的基石之一。学习之前,先看其定义:
  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,这种动态获取、调用对象方法的功能称为java语言的反射机制。
通过定义,可以看出反射是在运行状态中作用,对象可以通过反射的方式动态获取和调用任意一个类的方法、属性等。

- 反射如何使用?
  首先看一下我们正常要使用一个对象,是如何使用,一般地,我们定义一个类,给他赋值,可以在其他类中new出这个对象,然后调用对象中定义的属性和方法。代码如下:

package com.jbzhang.refdemo;

public class RefTest {
    public static void main(String[] args) {
      User user=new User();
      //h获取属性
        user.setUsername("jbzhang");
        //获取方法
        user.getUserBy();
    }
}

  那么反射怎么做呢?其实反射要做的事情就是从类或对象中推导出Class类,然后再从Class类中获得类的信息。
- 如何获取class类?
  在上面的例子中class类是User类的类。获取它有三种方式,如下:

//如果已经获取到类,通过静态变量获取class
Class c1=User.class;
//如果知道对象,通过getclass()获取类
Class c2=user.getClass();
//通过forname()获取
Class c3=Class.forName("com.jbzhang.refdemo.User");
System.out.println(c1==c3); //c1 c2  c3 都是一样的
System.out.println(c1.getName()); //com.jbzhang.refdemo.User  获取类的名字,包含包名
System.out.println(c1.getSimpleName());//User 获取类的名字

  我们得到了User的class类,那么就可以通过class获取很多需要的信息。比如类里面的方法、属性、构造函数等。下面的代码都有体现。

public class ClassUtil {
    public static  void   printClass() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class c=Class.forName("com.jbzhang.refdemo.User");
        //获取类的所有方法,有两种方式
        /**
         * getDeclaredMethods() 获取这个类自己声明的方法
         * getMethods() 获取所有public 的方法,包括父类的
         */
        Method[] m=c.getDeclaredMethods();
        //Method[] m1=c.getMethods();
        for (int i=0;i<m.length;i++){
            //得到所有方法的返回值
            Class cs=m[i].getReturnType();
            System.out.println("方法的返回值是"+cs.getName());
            //得到方法的名称
            System.out.println("方法名是:"+m[i].getName());
            //获得的参数类型
            Class[] par=m[i].getParameterTypes();
            for(int j=0;j<par.length;j++){
                System.out.println("方法的参数类型"+par[i].getName()+",");
            }
        }
        /**
         * 获取成员变量的数组
         * getFields()  获取所有public 的成员变量的信息
         * getDeclaredFields() 获取该类自己声明的变量
         */
        Field[] fs=c.getFields();
        Field[] fs1=c.getDeclaredFields();

        //获取构造方法的数组
        Constructor[] cst=c.getConstructors();
        for(int k=0;k<cst.length;k++){
            //获取构造方法的参数类型
            Class[] cpars=cst[k].getParameterTypes();
        }

        //获取特定的方法
        Method   method=c.getMethod("getUserBy");
        //方法调用
        method.invoke(c);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值