一、反射机制(比较简单,因为只要会查帮助文档,就可以了。)

1、反射机制有什么用?

  1. 通过java语言中的反射机制可以操作字节码文件。<br /> 优点类似于黑客。(可以读和修改字节码文件。)<br /> 通过反射机制可以操作代码片段。(class文件。)<br />

2、反射机制的相关类在哪个包下?

  1. java.lang.reflect.*;<br />

3、反射机制相关的重要的类有哪些?

  1. java.lang.Class:代表整个字节码,代表一个类型,代表整个类。
  2. java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。
  3. java.lang.reflect.Constructor:代表字节码中的构造方法字节码。代表类中的构造方法
  4. java.lang.reflect.Field:代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)。
  5. java.lang.Class:<br /> public class User{<br /> // Field<br /> int no;
  6. // Constructor<br /> public User(){<br /> <br /> }<br /> public User(int no){<br /> this.no = no;<br /> }
  7. // Method<br /> public void setNo(int no){<br /> this.no = no;<br /> }<br /> public int getNo(){<br /> return no;<br /> }<br /> }

二、获取java.lang.Class三种方法

1.Class.forName()

  1. 静态方法
  2. 方法的参数是一个字符串
  3. 字符串需要的是一个完整的类名
  4. 完整类名必须带有包名。

2.java中任何一个对象都有一个方法:getClass()

3.java中任何一种类型,包括基本类型,都有.class属性

  1. package com.xit.reflect;
  2. import java.util.Date;
  3. public class ReflectTest01 {
  4. public static void main(String[] args) {
  5. Class c1 = null;
  6. Class c2 = null;
  7. try {
  8. c1 = Class.forName("java.lang.String");
  9. c2 = Class.forName("java.util.Date");
  10. Class c3 = Class.forName("java.lang.Integer");
  11. Class c4 = Class.forName("java.lang.System");
  12. } catch (ClassNotFoundException e) {
  13. e.printStackTrace();
  14. }
  15. //java中任何一个对象都有一个方法:getClass()
  16. String s ="abc";
  17. Class x = s.getClass();
  18. System.out.println(c1==x);
  19. Date time = new Date();
  20. Class y = time.getClass();
  21. System.out.println(c2 == y);
  22. //第三种方式:java中任何一种类型,包括基本类型,都有.class属性
  23. Class z = String.class;
  24. System.out.println(x==z);
  25. }
  26. }

三、获取Class能干什么

image.png
image.png

四、反射机制的灵活

image.png

image.png

五、应用

1.只执行静态代码块

image.png

  1. package com.xit.reflect;
  2. public class ReflectTest04 {
  3. public static void main(String[] args) {
  4. try {
  5. Class.forName("com.xit.reflect.MyClass");
  6. } catch (ClassNotFoundException e) {
  7. e.printStackTrace();
  8. }
  9. }
  10. }
  11. class MyClass{
  12. static {
  13. System.out.println("静态代码执行了");
  14. }
  15. }