• Java分享笔记:关于Java反射机制


    [1] 关于Java反射机制的概述

      1.反射机制的概念:允许程序在执行期,借助于反射相关的API,取得任何类的内部信息,并能直接操作任意对象内部的属性和方法。

      2.与反射相关的主要的API:java.lang.Class(代表一个类),java.lang.reflect.Field(代表一个属性),java.lang.reflect.Method(代表一个方法),java.lang.reflect.Constructor(代表类的构造器)。

      3.关于类的Class实例的说明:创建一个类(.java文件),通过编译(javac.exe)生成对应的字节码文件(.class)。之后使用java.exe进行加载(类加载器)。将字节码文件加载进内存以后,就是所谓的运行时类,被存在缓存区。那么这个运行时类本身就是系统创建的Class的实例,这就是反射的源头。程序员可以对某个类的Class实例进行获取。

      以下是与反射相关的程序演示,分为Person.java,TestClass.java两个文件

    [2] Person.java文件

     1 package pack01;
     2 
     3 public class Person {
     4     
     5     public String name;
     6     private int age;
     7     
     8     //构造方法
     9     public Person() {
    10         
    11     }
    12     public Person(String name, int age) {
    13         this.name = name;
    14         this.age = age;
    15     }
    16     
    17     //操作name
    18     public void setName(String name) {
    19         this.name = name;
    20     }
    21     public String getName() {
    22         return name;
    23     }
    24     
    25     //操作age
    26     public void setAge(int age) {
    27         this.age = age;
    28     }
    29     public int getAge() {
    30         return age;
    31     }
    32     
    33     //重写toString方法
    34     public String toString() {
    35         return "name=" + name + " , age=" + age;
    36     }
    37     
    38     //其他方法
    39     public void displayInfo(String s) {
    40         System.out.println("info: " + s);
    41     }
    42 }

    [3] TestClass.java文件

     1 package pack01;
     2 
     3 import org.junit.Test;
     4 import java.lang.reflect.*;
     5 
     6 public class TestClass {
     7     
     8     //*******************获取运行时类的Class实例,常见的4种方法********************
     9     @Test
    10     @SuppressWarnings("rawtypes") //取消泛型警告
    11     public void testMethod1() throws ClassNotFoundException {
    12         
    13         //1.通过运行时类的class属性获取
    14         Class classOfPerson1 = Person.class;
    15         System.out.println( classOfPerson1 );
    16         
    17         //2.通过运行时类的对象获取,调用getClass()方法
    18         Person p1 = new Person();
    19         Class classOfPerson2 = p1.getClass();
    20         System.out.println( classOfPerson2 );
    21         
    22         //3.通过Class的静态方法forName()获取
    23         Class classOfPerson3 = Class.forName("pack01.Person");
    24         System.out.println( classOfPerson3 );
    25         
    26         //4.通过类的加载器ClassLoader获取
    27         ClassLoader cl = this.getClass().getClassLoader();
    28         Class classOfPerson4 = cl.loadClass("pack01.Person");
    29         System.out.println( classOfPerson4 );
    30         
    31     }
    32     
    33     //*****************通过反射创建运行时类的对象,并调用运行时类的属性和方法****************
    34     @Test 
    35     public void testMethod2() throws Exception {
    36         
    37         //1.使用类的class属性,获取运行时类Person类的Class实例
    38         Class<Person> classOfPerson = Person.class;
    39         
    40         //2.使用反射创建Person类的一个对象
    41         Person p1 = classOfPerson.newInstance();
    42         
    43         //3.使用反射获取Person类中的公有属性,并修改p1中的该属性
    44         Field f1 = classOfPerson.getField("name");
    45         f1.set(p1, "ZhangSan");
    46         
    47         //4.使用反射获取Person类中的私有属性,并修改p1中的该属性
    48         Field f2 = classOfPerson.getDeclaredField("age");
    49         f2.setAccessible(true);
    50         f2.set(p1, 20);
    51         
    52         //5.使用反射获取Person类的无参方法,并令p1执行该方法
    53         Method m1 = classOfPerson.getMethod("toString");
    54         String str = (String) m1.invoke(p1);
    55         System.out.println(str);
    56         
    57         //6.使用反射获取Person类的有参方法,并令p1执行该方法
    58         Method m2 = classOfPerson.getMethod("displayInfo", String.class);
    59         m2.invoke(p1, "I am from China.");
    60         
    61     }
    62 }

    注:希望与各位读者相互交流,共同学习进步。

  • 相关阅读:
    【python35小工具】b站弹幕保存
    w7 python35 输出中文乱码解决
    【python】版本35 正则-非库-爬虫-读写xlw文件
    【python小工具】我在bilibili个人资料里控制家里的电脑
    【python小工具】linux 低权限密码记录 提权小套路
    [学习交流]博客园 cnblog 添加github链接和自定义美化学习
    cp2102 驱动 win7x64 -2018
    基于Vue实现可以拖拽的树形表格(原创)
    不起眼的 z-index 却能牵扯出这么大的学问
    彻底搞懂CSS伪类选择器:is、not
  • 原文地址:https://www.cnblogs.com/EarthPioneer/p/9441170.html
Copyright © 2020-2023  润新知