java反射和动态代理
反射
什么是反射跟反射机制?
反射就是把Java类中的各个成分映射成一个个的Java对象。
即在运行状态中:1、对于任意一个类,都能够知道这个类的所有属性和方法;
2、对于任意一个对象,都能够调用它的任意一个属性和方法。
这种动态获取信息以及动态调用对象方法的功能叫Java的反射机制。
1、获取类(Class)对象
获取类对象有三种方法:
- 通过forName() -> 示例:Class.forName(“PeopleImpl”)
- 通过getClass() -> 示例:new PeopleImpl().getClass()
- .class直接获取 -> 示例:PeopleImpl.class
2、类的常用方法
- getName():获取类完整方法;
- getSuperclass():获取类的父类;
- newInstance():创建实例对象;
- getFields():获取当前类和父类的public修饰的所有属性;
- getDeclaredFields():获取当前类(不包含父类)的声明的所有属性;
- getMethod():获取当前类和父类的public修饰的所有方法;
- getDeclaredMethods():获取当前类(不包含父类)的声明的所有方法;
3.类方法调用
-
反射要调用类中的方法,需要通过关键方法“invoke()”实现的,方法调用也分为三种:
- 静态(static)方法调用
- 普通方法调用
- 私有方法调用
以下会分别演示,各种调用的实现代码,各种调用的公共代码部分,如下:
1 // 此段代码为公共代码 2 interface People { 3 int parentAge = 18; 4 public void sayHi(String name); 5 } 6 class PeopleImpl implements People { 7 private String privSex = "男"; 8 public String race = "汉族"; 9 @Override 10 public void sayHi(String name) { 11 System.out.println("hello," + name); 12 } 13 private void prvSayHi() { 14 System.out.println("prvSayHi~"); 15 } 16 public static void getSex() { 17 System.out.println("20岁"); 18 } 19 }
静态方法调用:
public static void main(String[] args) { Class myClass = Class.forName("example.PeopleImpl"); // 调用静态(static)方法 Method getSex = myClass.getMethod("getSex"); getSex.invoke(myClass); }
使用 getMethod(xx) 获取到对应的方法,直接使用 invoke(xx)
普通方法的调用:
需要先获取类示例,通过“newInstance()”方法获取Class myClass = Class.forName("example.PeopleImpl"); Object object = myClass.newInstance(); Method privSayHi = myClass.getDeclaredMethod("privSayHi"); privSayHi.setAccessible(true); // 修改访问限制 privSayHi.invoke(object);
动态代理
动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。
实现动态代理的方式很多,比如 JDK 自身提供的动态代理,就是主要利用了上面提到的反射机制。还有其他的实现方式,比如利用传说中更高性能的字节码操作机制,类似 ASM、cglib(基于 ASM)等
首先,它是一个代理机制。如果熟悉设计模式中的代理模式,我们会知道,代理可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成。通过代理可以让调用者与实现者之间解耦。比如进行 RPC 调用,通过代理,可以提供更加友善的界面。还可以通过代理,可以做一个全局的拦截器。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY