java反射机制

Posted by alonealice on 2016-10-23

JAVA反射机,简单的说就是在程序运行过程中,对于任意一个类、方法和对象,我们都能知道它的信息并且调用;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性。同时,我们可可以通过它来实现对原先无法调用的方法和对象的调用。因此在开发过程中有很重要的作用。那么我们要怎样来使用它呢?

获取类

获取累的对象几乎是所有操作的起始,获取类的方法主要有三种:

  1. 通过Class类获取
    Class personClass=Class.forName("module.Person");//获得class
  2. 直接获取
    Class personClass=Person.class;
  3. 通过对象获取
    Person person=new Person(); Class personClass=person.getClass();

获取构造方法

获取类对象后,我们可以通过它获取它的构造方法

  1. 获取构造方法数量
1
2
personClass.getDeclaredConstructors();// 获取所有的申明构造方法
personClass.getConstructors();// 获取公开的构造方法
  1. 获取指定参数的构造方法
    personClass.getConstructor(new Class[]{int.class});//获取int参数的构造方法
  2. 获取构造方法的参数类型
1
2
Constructor constructor=personClass.getConstructors()[i];//获取第i个构造方法
constructor.getParameterTypes();//获取该构造方法的全部参数类型

获取属性

在获取了类之后,我们就可以通过这个类获取它里面的属性。

  1. 获取属性的数量
    personClass.getFields();//获取所有的公开参数
    personClass.getDeclaredFields();//获取所有的声明参数
    这两个方法的区别是getDeclaredFields()返回Class中所有的字段,包括私有字段,而getFields 只返回公共字段,同时包括父类继承的公开字段。类似的在获取方法、获取注解等。
  2. 获取指定属性
    personClass.getField("gender");
  3. 修改属性
1
2
Person person=new Person();
field.set(person,4);//设置参数

同时如果修改的属性是私有的,我们需要设置field可修改
field.setAccessible(true);

获取方法

  1. 获取方法数量
1
2
personClass.getDeclaredMethods();//获取所有申明的方法
personClass.getMethods();//获取公开的方法
  1. 获取指定到方法
    personClass.getDeclaredMethod("setName",String.class);//如果没参数就设置null
  2. 调用方法
1
2
3
method.setAccessible(true);//设置私有参数和方法可修改
Person o= (Person) personClass.getConstructor().newInstance();
method.invoke(o,"hello");//person设置name为hello

获取注解

可以获取注解信息

  1. 获取类、方法、属性、方法参数的注解
1
2
3
4
personClass.getAnnotation(DefaultName.class);
method.getAnnotation(DefaultName.class);
field.getAnnotation(DefaultName.class);
method.getParameterAnnotations()//获取方法参数注解;
  1. 获取注解值
    ((DefaultName)annotation).name();// name为注解方法

java反射的内容还有很多,这里就不再介绍了。