微信扫一扫

028-83195727 , 15928970361
business@forhy.com

Java基础之-反射

java,反射2016-08-02

0.什么是反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

1.获取Class对象

反射的第一步,就是去获取Class对象,而我们获取Class对象有三种方法,下面一一说明。

1.1方法一
Class<?> clz = User.class;
1.2方法二
User user = new User(1,"quanshijie");
Class<?> clz = user.getClass();
1.3方法三
        try {
            Class<?> clz = Class.forName("com.example.User");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

2.通过Class对象构造目标类型的对象

            Class clz = Class.forName("com.example.User");
            //获取对应的构造函数 这里的构造函数参数为 int,String
            Constructor constructor = clz.getConstructor(int.class,String.class);
            //利用构造函数生成对象
            User user = (User) constructor.newInstance(1,"username");
            user.toString();
  • 先获取Class对象
  • 在获取构造函数,注意参数类型 ‘
  • 利用构造函数构造对象

当然,这里通过另外两种方式也是一样的。我们看下控制台的输出。

3.获取构造函数

上面的小例子中,我们获取了构造函数。通常我们有两种获取构造函数的方法。

  • 通过指定参数class获取 getConstructor
  • 获取所有构造函数 getConstructors

4.设置accessible

我们通过设置accessible为true来提升反射的速度。

constructor.setAccessible(true);

5.获取类中的函数

我们通常有四中方法来获取。
* getMethod 只能获取public
* getMethods 只能获取public
* getDeclaredMethods 获取所有方法
* getDeclaredMethod 获取当前类和当前父类的。

Method method = clz.getDeclaredMethod("setName",String.class);
method.invoke(user,"change");
  • 通过方法名和参数类型获取方法
  • 在通过invoke在修改

我们看下控制台输出结果。

6.获取类中的字段

好吧,这里有两种方法。

  • getField 获取指定字段,只能获取public的
  • getFields
  • getDeclaredField 获取指定
  • getDeclaredFields
Field field = clz.getDeclaredField("name");
field.set(user,"change field");

结果如下:

7. 获取父类、接口、注解等

这部分内容相对来说我们用的比较少,所以给出用法。

获取父类

clz.getSuperclass();

获取接口

clz.getInterfaces()

获取注解

clz.getAnnotations();

当然,内容不止这么点,剩下的就自己探索吧。