1.什么是反射?
反射其实就是动态的加载类,我们在写JDBC的时候加载驱动Class.forName("xxx")时就涉及到了反射。
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2.反射机制能做什么?
1. 在运行时判断任意一个对象的所属的类Class。
2. 在运行时判断构造任意一个类的对象Constructor。
3. 在运行时判断任意一个类所具有的成员变量Field和方法Method。
4. 在运行时调用任意一个对象的方法。method.invoke(object,args)
3.反射机制相关的API
获得完整的包名和类名
Student.java
1 package com.reflect.test; 2 3 public class Student { 4 private int id; 5 private String name; 6 7 public Student() {} 8 9 public Student(int id, String name) { 10 super(); 11 this.id = id; 12 this.name = name; 13 } 14 15 public int getId() { 16 return id; 17 } 18 19 public void setId(int id) { 20 this.id = id; 21 } 22 23 public String getName() { 24 return name; 25 } 26 27 public void setName(String name) { 28 this.name = name; 29 } 30 31 @Override 32 public String toString() { 33 return "Student [id=" + id + ", name=" + name + "]"; 34 } 35 36 37 38 39 }
Test.java
package com.reflect.test; public class Test { Student stu = new Student(); public static void main(String[] args) { Test test = new Test(); test.getClassName(); } //获得完整的包名和类名 public void getClassName() { System.out.println(stu.getClass().getName()); } }
运行结果
com.reflect.test.Student
获取Class的三种方法
public static void main(String[] args) { Test test = new Test(); test.getStudentClass(); } //获取Class对象的三种犯法 public void getStudentClass() { //第一种方法,forName Class<?> class1; try { class1 = Class.forName("com.reflect.test.Student"); System.out.println("class1:"+class1); } catch (ClassNotFoundException e) { e.printStackTrace(); } //第二种方法,class Class<?> class2 = Student.class; System.out.println("class2:"+class2); //第三种方法,getClass() Student stu1 = new Student(); Class<?> class3 = stu1.getClass(); System.out.println("class3:"+class3); }
运行结果
class1:class com.reflect.test.Student class2:class com.reflect.test.Student class3:class com.reflect.test.Student