当前位置: 首页 > ops >正文

Java:反射

什么是反射?

反射允许对成员变量,成员方法和构造方法的信息进行编程访问

为了使用反射,首先要获取Class对象,才能剖析类中各种属性

获取方法Class对象的方法

1·Class.forName("全类名");

2·类名.class

3·对象.getClass();

Class类中用于获取构造方法的方法

利用class对象获取类中的构造方法(Constructor)

先获取类的编码对象

获取所有的public修饰的构造方法

获取所有的任意权限符修饰的构造方法

要特定获取某个构造方法就要在括号里面加上它的 参数类型的编码对象,顺序要一直

获取一个参数为int的构造方法,

获取一个参数为String的构造方法,

获取一个参数为String和int的构造方法

获取一个参数为空的构造方法

查看构造方法的权限修饰符con.getModifiers();

int modifiers = con4.getModifiers();返回的数值就是对应的修饰符

使用Construcor对象创建类的对象

诺是私有化修饰的构造方法则需要先跳过权限检查

Class类中用于获取成员变量的方法

利用class对象获取类中的成员变量(Field)

获取所有public修饰的成员变量

获取单个成员变量

获取单个成员变量非共有修饰的

获取成员变量的权限修饰符

通过Field获取成员变量的各种信息

通过Field修改某一个实例对象中成员变量里面的值

Class类中用于获取成员方法的方法

利用class对象获取类中的成员变量(Method)

获取所有的公共方法对象(包含父类中所有的公共方法)

获取所有的方法包含私有

获取特有的方法,第一个参数是方法名字,第二个参数是方法参数

获取方法的修饰符

获取方法中的其他信息

用Method类来进行方法运行

m获取的是Student类中的方法,用m调用invoke方法来运行

先创建一个实例,然后调用invoke方法,第一个参数是对象,第二个参数是方法里面的实际参数,

如果有返回值就要进行接受

动态代理

特点:无侵入式的给代码增加额外的功能

在Java中实现动态代理主要借助 java.lang.reflect.Proxy 类和 InvocationHandler 接口,下面通过一个简单的示例来详细说明实现步骤:
 
定义一个接口:被代理的类需要实现该接口,代理类也会实现这个接口。
 
// 定义一个接口
interface HelloService {
    void sayHello();
}
 
 
实现接口的类(真实主题类):这是真正的业务逻辑实现类。
 
// 实现接口的类
class HelloServiceImpl implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("Hello, world!");
    }
}
 
 
实现InvocationHandler接口:创建一个类实现 InvocationHandler 接口,并重写 invoke 方法,在 invoke 方法中编写代理的逻辑,包括在调用真实方法前后执行的操作。
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

// 实现InvocationHandler接口
class MyInvocationHandler implements InvocationHandler {
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("调用真实方法前的逻辑");
        Object result = method.invoke(target, args);
        System.out.println("调用真实方法后的逻辑");
        return result;
    }
}
 
 
创建动态代理对象:使用 Proxy.newProxyInstance 方法来创建动态代理对象,该方法接收三个参数:被代理对象的类加载器、被代理对象实现的接口数组、 InvocationHandler 实例。
 
import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {
        HelloService helloService = new HelloServiceImpl();
        MyInvocationHandler handler = new MyInvocationHandler(helloService);
        // 创建动态代理对象
        HelloService proxy = (HelloService) Proxy.newProxyInstance(
                helloService.getClass().getClassLoader(),
                helloService.getClass().getInterfaces(),
                handler);
        proxy.sayHello();
    } 
}
 
 
在上述代码中, MyInvocationHandler 类实现了 InvocationHandler 接口, invoke 方法中添加了在调用真实方法前后执行的逻辑。通过 Proxy.newProxyInstance 方法创建了动态代理对象 proxy ,当调用 proxy.sayHello() 时,实际会调用 MyInvocationHandler 的 invoke 方法,并在其中调用真实对象的 sayHello 方法。
 

http://www.xdnf.cn/news/2044.html

相关文章:

  • Linux基础IO(十)之静态库(后续出动态库)
  • 论分布式事务及其解决方案 架构师论文范文(考试笔记)
  • 计算机操作系统
  • 人口老龄化丨AI健康小屋如何实现防病于未然​
  • HTTP状态码
  • 使用Tortoise-ORM和FastAPI构建评论系统
  • Gmail安卓版邮件同步速度与隐私保护测评【体验对比】
  • 保安员证考试的理论知识有哪些重点?
  • 从原生检索到异构图:Native RAG、GraphRAG 与 NodeRAG 架构全景解析
  • 关注心理健康,开启心灵养生之旅
  • 如何用AI主动突出画面主体!涂鸦新方案助剪辑、工业巡检、医疗影像等领域,实现自动追踪+智能放大
  • BUUCTF-[ACTF新生赛2020]SoulLike
  • 伊克罗德信息亮相亚马逊云科技合作伙伴峰会,以ECRobot 智能云迁移助手在GenAI Tech Game比赛勇夺金牌!
  • 从零开始学Python游戏编程39-碰撞处理1
  • MySQL 从入门到精通
  • 【算法】单词搜索、最短距离
  • 增加首屏图片
  • MCP Server 实现笔记:开发者视角下的优缺点
  • MySQL InnoDB 存储引擎间隙锁(Gap Lock)
  • 《Pinia实战》10.手册
  • 数据结构(java)二叉树的基本操作
  • AI与思维模型【77】——PDCA思维模型
  • 1.2-1.3考研408计算机组成原理第一章 计算机系统概述
  • 【3】GD32 基础外设:GPIO、外部中断、DMA、定时器、实时时钟、看门狗
  • vue next()、next(“/“)、next({...to})、next({...to,replace:true})的区别
  • 机器人行业研究系列报告
  • 遥测终端机,推动灌区流量监测向数据驱动跃迁
  • 《遥测终端机:农业水价改革的智能助手》
  • python 环状图 (pycirclize)
  • AI与思维模型【78】——周哈里窗思维模型