Java基础——反射

本文详细介绍了Java反射机制,包括基本概念、反射的应用、常用反射类如Class、Method、Field和Constructor的使用,以及类加载的过程。通过反射可以在运行时动态创建对象、访问成员变量和方法,但需要注意反射可能带来的性能影响。此外,还探讨了不同类加载场景,如静态和动态加载,以及类加载的各个阶段和任务。
摘要由CSDN通过智能技术生成

一、反射机制

1.1 基本介绍

  1. 反射机制允许程序在执行期借助于(Reflection  API)取得任何类的内部信息(比如成员变量,构造器,成员方法等等), 并能操作对象的属性及方法。 反射在设计模式和框架底层都会用到。
  2.  加载完类之后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的完整结构信息。 通过这个对象得到类的结构。 这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为:反射。
     

1.2 发射机制的应用

        1、在运行时判断任意一个对象所属的类

        2、在运行时构造任意一个类的对象
        3、在运行时得到任意一个类所具有的成员变量和方法

        4、在运行时调用任意一个对象的成员变量和方法

        5、生成动态代理

 1.3  反射常用类

  1. java.lang.Class : 代表一个类, Class对象表示某个类加载后在堆中的对象
  2.  java.lang.reflect. Method : 代表类的方法,Method对象表示某个类的方法
  3. java.lang.refiect.Field : 代表类的成员变量,Field对象表示某个类的成员变量
  4.  java.lang.reflect.Constructor : 代表类的构造方法,Constructor对象表示构造器

1.4 反射的演示

根据配置文件指定信息,创建Dog对象,并调用say()方法

classfullpath=org.example.Dog
method=say
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Dog implements Serializable {
    private String name;
    public int age;
    private String Country;
    public void say(){
        System.out.println("啊楠在唱歌");
    }
    public Dog(String name){

    }
}
public class Reflection01 {
    public static void main(String[] args) throws Exception {
        //1. 使用 Properties 类, 可以读写配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();//"com.hspedu.Cat"
        String methodName = properties.get("method").toString();//"hi"
        //2. 使用反射机制解决
        //(1) 加载类, 返回 Class 类型的对象 cls
        Class cls = Class.forName(classfullpath);
        //(2) 通过 cls 得到你加载的类 com.hspedu.Cat 的对象实例
        Object o = cls.newInstance();
        System.out.println("o 的运行类型=" + o.getClass()); //运行类型
        //(3) 通过 cls 得到你加载的类 com.hspedu.Cat 的 methodName"hi" 的方法对象
        // 即:在反射中,可以把方法视为对象(万物皆对象)
        Method method1 = cls.getMethod(methodName);
        //(4) 通过 method1 调用方法: 即通过方法对象来实现调用方法
        System.out.println("=============================");
        method1.invoke(o); //传统方法 对象.方法() , 反射机制 方法.invoke(对象)
        //java.lang.reflect.Field: 代表类的成员变量, Field 对象表示某个类的成员变量
        //得到 name 字段
        //getField 不能得到私有的属性
        Field nameField = cls.getField("age"); //
        System.out.println(nameField.get(o)); // 传统写法 对象.成员变量 , 反射 : 成员变量对象.get(对象)
        //java.lang.refl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值