categories: Java
—-

反射的概念

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

在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。

若程序运行时接收到外部传入的一个对象,该对象的编译类型是Object,但程序又需要调用该对象运行类型的方法:

  1. 若编译和运行类型都知道,使用 instanceof判断后,强转。
  2. 编译时根本无法预知该对象属于什么类,程序只能依靠运行时信息来发现对象的真实信息,这时就必须使用反射了。
  3. 要是想得到对象真正的类型,就得使用反射。

    Java中,能够调用什么方法,看对象的引用,具体调用什么方法,看引用指向的对象。

反射的优缺点

为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,

  1. 静态编译:在编译时确定类型,绑定对象,即通过。
  2. 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。

    一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发。

它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。

反射获取类

  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. /**
  6. * @author zzg
  7. * @date 2021.2.5
  8. */
  9. public class Reflect {
  10. public static void main(String[] args) throws NoSuchFieldException,ClassNotFoundException,NoSuchMethodException,InstantiationException,IllegalAccessException, InvocationTargetException {
  11. // 这里是正向new一个类,属于静态编译
  12. Phone phone=new Phone();
  13. // phone.setCPU("Intel i5");
  14. // System.out.println(phone.getCPU());
  15. 这里是反射获取类
  16. Class cla=Phone.class;
  17. Constructor constructor=cla.getConstructor();//获取类的构造函数
  18. constructor.setAccessible(true);//设置构造方法可访问
  19. Object phone=constructor.newInstance();//动态创造一个类的实例
  20. Method method=cla.getMethod("setCPU", String.class);//获取类的方法
  21. method.invoke(phone,"AMD,yes");//执行方法,需要指定对象
  22. Method get=cla.getMethod("getCPU");
  23. System.out.println(get.invoke(phone));
  24. Field field=cla.getDeclaredField("CPU");
  25. field.setAccessible(true);
  26. field.set(phone,"Intel better");
  27. System.out.println(get.invoke(phone));
  28. // Method set=cla.getMethod("setCPU", String.class);
  29. // Object obj=cla
  30. }
  31. }
  32. class Phone{
  33. private String CPU;
  34. private String Battery;
  35. public Phone(){
  36. }
  37. public void setCPU(String cpu){
  38. this.CPU=cpu;
  39. }
  40. public String getCPU(){
  41. if(CPU==null){
  42. return "还没有设置CPU";
  43. }else{
  44. return this.CPU;
  45. }
  46. }
  47. public void setBattery(String battery){
  48. this.Battery=battery;
  49. }
  50. public String getBattery(){
  51. if(Battery==null){
  52. return "还没有设置battery";
  53. }else{
  54. return this.Battery;
  55. }
  56. }
  57. }