Java反射

Java反射允许程序在运行时检查和修改行为。它可以用于动态加载类、获取类信息、调用方法、修改属性以及生成动态代理。虽然强大,但反射可能影响性能,应谨慎使用。
摘要由CSDN通过智能技术生成

反射是框架设计的灵魂

Java反射是Java语言中一项非常强大的特性,它允许程序在运行时检查和修改自身的行为。在本篇博客中,我们将介绍Java反射的概念、用途和实现方式。

1. 什么是Java反射?

Java反射是指在运行时检查和修改Java程序中对象的能力。通常情况下,我们在编写Java程序时,需要提前知道每个类的方法和属性,然后才能使用它们。但是,有些情况下,我们希望在程序运行时动态地获取类的信息、调用其方法或者修改其属性,这时候就需要使用Java反射。

2. Java反射的用途

1 动态加载类

在Java程序运行时,可以动态地加载类。这对于需要动态加载类的应用程序非常有用,比如应用程序可以根据用户的输入来加载相应的类。

2 获取类信息

Java反射可以用于获取类的信息,包括类名、父类、接口、构造方法、方法、字段等。

3 调用方法

Java反射可以用于调用类的方法,即使这些方法在编译时还没有创建

4 修改属性

Java反射可以用于修改类的属性,即使这些属性在编译时还没有创建

5 生成动态代理

Java反射可以用于生成动态代理,从而可以在运行时生成代理对象,以便在代理对象上执行方法。

3. Java反射的实现方式

Java反射的实现方式主要包括以下几个步骤:

3.1 获取类对象

在使用Java反射时,首先需要获取类对象。可以使用Class.forName()方法获取类对象,也可以使用类的.class属性获取类对象。

    //1.通过全类名获取
    Class cla = Class.forName("com.man.services.impl.BookServicesImpl");
    System.out.println("cla");

3.2 获取构造方法

        //2.通过Class获取类的构造器
        Constructor constructor = cla.getDeclaredConstructor();

3.3 创建对象

使用Class对象的newInstance()方法可以创建一个类的实例。如果需要调用有参数的构造方法,可以先获取构造方法,然后使用newInstance()方法创建实例。

        //3.使用构造器对象
        BookServices bookServices = (BookServices) constructor.newInstance();

3.5 调用方法

使用Class对象的getMethod()方法可以获取方法,然后使用Method对象的invoke()方法调用方法。如果需要调用私有方法,可以使用getDeclaredMethod()方法获取私有方法,并设置setAccessible()方法为true,以便访问私有方法。

        //4.使用对象调用方法
        bookServices.add();

3.6 写入配置文件完整案例

info.properties 配置文件里面以键值对的格式存值

className=com.man.services.impl.BookServicesVipImpl
methodName=add

test01

package com.man.test;

import com.man.services.BookServices;

import java.lang.reflect.Constructor;

public class test01 {
    public static void main(String[] args) throws Exception {
        //1.通过全类名获取
        Class cla = Class.forName("com.man.services.impl.BookServicesImpl");
        System.out.println("cla");
        //2.通过Class获取类的构造器
        Constructor constructor = cla.getDeclaredConstructor();
        //3.使用构造器对象
        BookServices bookServices = (BookServices) constructor.newInstance();
        //4.使用对象调用方法
        bookServices.add();
    }
}

test02

package com.man.test;

import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;

public class test02 {
    public static void main(String[] args) throws Exception {
        //读取配置文件,获取内容
        InputStream stream = test02.class.getClassLoader().getResourceAsStream("info.properties");
        Properties p = new Properties();
        p.load(stream);
        String className = p.getProperty("className");
        String methodName= p.getProperty("methodName");

        //1.通过全类名获取
        Class cla = Class.forName(className);
        //2.通过Class获取类的构造器
        Constructor constructor = cla.getDeclaredConstructor();
        //3.使用构造器对象
        Object obj = constructor.newInstance();
        //4.获取方法名
        Method method = cla.getDeclaredMethod(methodName);
        //5.执行方法
        method.invoke(obj);

    }
}

4. 结论

Java反射是一项非常强大的特性,可以让程序在运行时动态地获取类的信息、调用方法或者修改属性。虽然Java反射很灵活,但是由于需要在运行时进行类型检查,所以会影响程序的性能。因此,在使用Java反射时,需要注意性能问题,并且尽可能地避免使用反射来访问属性和调用方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值