反射的案例

太过爱你忘了你带给我的痛 2024-04-08 13:21 153阅读 0赞

1.反射获取构造方法并使用练习1【应用】

  • 案例需求

    • 通过反射获取公共的构造方法并创建对象
  • 代码实现

    • 学生类

    public class Student {

    1. //成员变量:一个私有,一个默认,一个公共
    2. private String name;
    3. int age;
    4. public String address;
    5. //构造方法:一个私有,一个默认,两个公共
    6. public Student() {
    7. }
    8. private Student(String name) {
    9. this.name = name;
    10. }
    11. Student(String name, int age) {
    12. this.name = name;
    13. this.age = age;
    14. }
    15. public Student(String name, int age, String address) {
    16. this.name = name;
    17. this.age = age;
    18. this.address = address;
    19. }
    20. //成员方法:一个私有,四个公共
    21. private void function() {
    22. System.out.println("function");
    23. }
    24. public void method1() {
    25. System.out.println("method");
    26. }
    27. public void method2(String s) {
    28. System.out.println("method:" + s);
    29. }
    30. public String method3(String s, int i) {
    31. return s + "," + i;
    32. }
    33. @Override
    34. public String toString() {
    35. return "Student{" +
    36. "name='" + name + '\'' +
    37. ", age=" + age +
    38. ", address='" + address + '\'' +
    39. '}';
    40. }

    }

测试类

  1. public class ReflectDemo02 {
  2. public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
  3. //获取Class对象
  4. Class<?> c = Class.forName("com.itheima_02.Student");
  5. //public Student(String name, int age, String address)
  6. //Constructor<T> getConstructor(Class<?>... parameterTypes)
  7. Constructor<?> con = c.getConstructor(String.class, int.class, String.class);
  8. //基本数据类型也可以通过.class得到对应的Class类型
  9. //T newInstance(Object... initargs)
  10. Object obj = con.newInstance("林青霞", 30, "西安");
  11. System.out.println(obj);
  12. }
  13. }

2.反射获取构造方法并使用练习2【应用】

  • 案例需求

    • 通过反射获取私有构造方法并创建对象
  • 代码实现

    • 学生类:参见上方学生类
    • 测试类

    public class ReflectDemo03 {

    1. public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    2. //获取Class对象
    3. Class<?> c = Class.forName("com.itheima_02.Student");
    4. //private Student(String name)
    5. //Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
    6. Constructor<?> con = c.getDeclaredConstructor(String.class);
    7. //暴力反射
    8. //public void setAccessible(boolean flag):值为true,取消访问检查
    9. con.setAccessible(true);
    10. Object obj = con.newInstance("林青霞");
    11. System.out.println(obj);
    12. }

    }

3.反射获取成员变量并使用练习【应用】

  • 案例需求

    • 通过反射获取成员变量并赋值
  • 代码实现

    • 学生类:参见上方学生类
    • 测试类

    public class ReflectDemo02 {

    1. public static void main(String[] args) throws Exception {
    2. //获取Class对象
    3. Class<?> c = Class.forName("com.itheima_02.Student");
    4. //Student s = new Student();
    5. Constructor<?> con = c.getConstructor();
    6. Object obj = con.newInstance();
    7. System.out.println(obj);
    8. //s.name = "林青霞";

    // Field nameField = c.getField(“name”); //NoSuchFieldException: name

    1. Field nameField = c.getDeclaredField("name");
    2. nameField.setAccessible(true);
    3. nameField.set(obj, "林青霞");
    4. System.out.println(obj);
    5. //s.age = 30;
    6. Field ageField = c.getDeclaredField("age");
    7. ageField.setAccessible(true);
    8. ageField.set(obj,30);
    9. System.out.println(obj);
    10. //s.address = "西安";
    11. Field addressField = c.getDeclaredField("address");
    12. addressField.setAccessible(true);
    13. addressField.set(obj,"西安");
    14. System.out.println(obj);
    15. }

    }

4.反射获取成员方法并使用练习【应用】

  • 案例需求

    • 通过反射获取成员方法并调用
  • 代码实现

    • 学生类:参见上方学生类
    • 测试类

    public class ReflectDemo02 {

    1. public static void main(String[] args) throws Exception {
    2. //获取Class对象
    3. Class<?> c = Class.forName("com.itheima_02.Student");
    4. //Student s = new Student();
    5. Constructor<?> con = c.getConstructor();
    6. Object obj = con.newInstance();
    7. //s.method1();
    8. Method m1 = c.getMethod("method1");
    9. m1.invoke(obj);
    10. //s.method2("林青霞");
    11. Method m2 = c.getMethod("method2", String.class);
    12. m2.invoke(obj,"林青霞");

    // String ss = s.method3(“林青霞”,30);
    // System.out.println(ss);

    1. Method m3 = c.getMethod("method3", String.class, int.class);
    2. Object o = m3.invoke(obj, "林青霞", 30);
    3. System.out.println(o);
    4. //s.function();

    // Method m4 = c.getMethod(“function”); //NoSuchMethodException: com.itheima_02.Student.function()

    1. Method m4 = c.getDeclaredMethod("function");
    2. m4.setAccessible(true);
    3. m4.invoke(obj);
    4. }

    }

5.反射练习之越过泛型检查

  • 案例需求

    • 通过反射技术,向一个泛型为Integer的集合中添加一些字符串数据
  • 代码实现
  • public class ReflectTest01 {

    1. public static void main(String[] args) throws Exception {
    2. //创建集合
    3. ArrayList<Integer> array = new ArrayList<Integer>();

    // array.add(10);
    // array.add(20);
    // array.add(“hello”);

    1. Class<? extends ArrayList> c = array.getClass();
    2. Method m = c.getMethod("add", Object.class);
    3. m.invoke(array,"hello");
    4. m.invoke(array,"world");
    5. m.invoke(array,"java");
    6. System.out.println(array);
    7. }

    }

6.运行配置文件中指定类的指定方法

  • 案例需求

    • 通过反射运行配置文件中指定类的指定方法
  • 代码实现

    public class ReflectTest02 {

    1. public static void main(String[] args) throws Exception {
    2. //加载数据
    3. Properties prop = new Properties();
    4. FileReader fr = new FileReader("myReflect\\class.txt");
    5. prop.load(fr);
    6. fr.close();
    7. /*
    8. className=com.itheima_06.Student
    9. methodName=study
    10. */
    11. String className = prop.getProperty("className");
    12. String methodName = prop.getProperty("methodName");
    13. //通过反射来使用
    14. Class<?> c = Class.forName(className);//com.itheima_06.Student
    15. Constructor<?> con = c.getConstructor();
    16. Object obj = con.newInstance();
    17. Method m = c.getMethod(methodName);//study
    18. m.invoke(obj);
    19. }

    }

发表评论

表情:
评论列表 (有 0 条评论,153人围观)

还没有评论,来说两句吧...

相关阅读

    相关 学习笔记

    反射的概述 – 什么是反射 > 反射机制是在运行状态中,对于任意一个类可以获取这个类的属性和方法,对于任何一个对象能调用它任意属性和方法!这种动态获取信息和动态调

    相关 使用

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

    相关 Java深入浅出

    刚开始接触反射这个概念,感觉反射这个机制很复杂很难懂,所以在这篇文章中对java的反射机制以个人的理解总结归纳。 1. 什么是反射? 什么是反射?在官方文档中是这样说的