Java反射

一:什么是反射?

想要知道什么是反射,首先要知道什么是类,类和对象的关系。

在现实中是先有对象然后才有类的,比如说人们发现了猫、老虎、狮子有许多相同的属性和行为,就将它们称为猫科。在代码中,猫科就是类,每一只老虎都是一个对象。

而在代码中,是先有类,然后才能出现对象的。类用来描述对象,是对象的模板,是用来生产对象的工厂,通过某个类生产出来的对象,会拥有类所有的非私有方法和属性。

而每个类,又都有属性、方法、构造器等等。反射机制就是用来描述类的。(8个基本数据类型也可以描述)

注意:反射机制有6个,下面图片中少写了一个Annotation(描述注解的) 

二:反射的使用

Class      用来描述类本身

Package      用来描述类所属的包

Method     用来描述类中的方法

Constructor    用来描述类中的构造方法

Annotation    用来描述类中的注解

 

public class  Student{

  public String name;

  private int age;

  public Student(){}

  public Student(String name,int age) {

    this.name = name;

    this.age = age;

  }

  public void eat(String food){}  

  private void eat(){}  

}

 

1:Class  可以通过一个Class对象来操作.class类

   创建Class的三种方式:

  (1):Class  clzz = Class.forName(包名+类名)

  (2):Class clzz = new Student().getClass();

  (3):Class clzz = Student.class

  这个clzz就相当于是Student类

  Class的常用方法:

  Class clzz = Student.class

  (1):clzz.getModifiers() //获取clzz的修饰符,返回值为int类型,如果类同时存在权限修饰符和特征修饰符那么返回两个修饰符对应的数字之和

  (2):clzz.getName() //返回clzz的名字(包含包名)

  (3):clzz.getSimpleName() //返回clzz的名字(不包含包名)

  (4):clzz.getPackage() //返回clzz所在包的对象

  (5):clzz.getSuperclass() //返回clzz的父类Class对象

  (6):clzz.getInterFaces() //返回clzz的实现接口,返回Class数组

  (7):clzz.getDeclaredConstructor().newInstance(); //通过clzz创建无参的Student对象

  (8)Field[] field = clzz.getFields();  //获取全部非私有属性的方法(包含父类)

  (9)Field field = clzz.getField("name");  //获取单个非私有属性的方法

  (10)Field field = clzz.getDeclaredField("age");  //获取私有属性的方法(不能获取父类的属性)

  (11)Field[] fields = clzz.getDeclaredFields()   //获取所有的属性(包含私有),但无法获取父类属性

  (12)Method met = clzz.getMethod("eat","西瓜")  //获取非私有的方法

  (13)Method[] mets = clzz.getMethods()  //获取全部的非私有的方法

   (14)Method met1 = clzz.getDeclaredMethod("learn");  //获取私有方法

 

2:Field  可以操作类的属性(通过Class对象创建)

  Class clzz = Student.class;

  Student stu = (Student)clzz.getDeclaredConstructor().newInstance();

  设置和获取非私有属性的值,需要对象

  Field field = clzz.getField("name")

  field.set(stu,"张三丰") //设置

  String name = (String)field.get(stu) //获取

  设置和获取私有属性的值

  Field field = clzz.getDeclaredField("age")

  field.setAccessible(true) //将此属性设置为可修改,然后和非私有属性设置获取是一样的

  field.getModifiers() //获取属性的修饰符

  field.getType()  //获取属性的类型

  field.getName()  //获取属性的名字

 

 

3:Method  可以操作方法

  Class clzz = Student.class;

 

  Student stu = (Student)clzz.getDeclaredConstructor().newInstance();

  Method met = clzz.getMethod("eat",String.class)

  Method met2 = clzz.getDeclaroMethod("eat")

  Class mrt = met.getReturnType  //获取方法的返回值类型

  String name = met.getName()  //获取方法的名字

  Class[] css = met.getParameterTypes();  //获取方法的参数列表

  Class[] ycs = met.getExceptionTypes()  //获取方法抛出的异常

  met.invoke(stu,"西瓜")   //非私有方法执行

  met.setAccessible(true);met2.invoke(stu)  //私有方法执行

 

 

  

  

posted @ 2019-12-12 12:00  拔丝小红薯  阅读(144)  评论(0编辑  收藏  举报