Python工程师Java之路(l)反射

python使用javalang检索代码 业务背景:使用aop读写分离的时候,dao开启事务,导致在mapper中切换数据源不起作用,所以只能在dao方法中切换数据源, 为避免存在读方法中的存在写数据库的逻辑,检索下java 类中的方法是否同时存在读写数据库的行为,if not fragment: # 如果fragment为空的时候,此处就为真,执行break语句。# 判断是否是MethodDeclaration对象。# print("成员变量:")# # 声明变量修饰符。# # 声明变量类型。# # 声明变量名。 阅读详情

1、类加载

类在内存中的生命周期:

加载
使用
卸载

1.1、类的加载过程

当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过【加载、连接、初始化】三个步骤来对该类进行初始化

  1. 加载(load):将类型的class字节码数据读入内存
  2. 连接(link)
    • 验证:校验合法性等
    • 准备:准备对应的内存,创建Class对象,为类变量赋默认值,为静态常量赋初始值
    • 解析:把字节码中的符号引用替换为对应的直接地址引用
  3. 初始化(initialize):执行<clinit>类初始化方法

1.2、类初始化

1.2.1、哪些使用类的操作,但是不会导致类的初始化?

使用某个类的静态的常量(static final)

class A {
    static {System.out.println("静态代码块");}
    static final int a = 2;
}

public class Hello {
    public static void main(String[] args) {
        System.out.println(A.a); // 只打印2
    }
}

通过子类调用父类的静态变量,静态方法,只会导致父类初始化,不会导致子类初始化

package d.e.f;

class A {
    static {System.out.println("静态代码块A");}
    static int a = 2;
    public static void m() {System.out.println("静态方法");}
}

class B extends A {
    static {System.out.println("静态代码块B");}
}

public class Hello {
    public static void main(String[] args) {
        System.out.println(B.a);
        B.m();
        // 静态代码块B没有打印出来
    }
}

用某个类型声明数组并创建数组对象时

class B {}

public class Hello {
    public static void main(String[] args) {
        B[] arr = new B[5]; // 什么都不打印
    }
}

1.3、类加载器

(1)引导类加载器(Bootstrap Classloader)又称为根类加载器
负责加载 jre/rt.jar核心库
(2)扩展类加载器(Extension ClassLoader)
负责加载 jre/lib/ext扩展库
是 ClassLoader的子类
(3)应用程序类加载器(Application Classloader)
它负责加载项目的classpath路径下的类
是 ClassLoader的子类
(4)自定义类加载器
当程序需要加载“特定”目录下的类,可以自定义类加载器;
当程序的字节码文件需要加密时,那么往往会提供一个自定义类加载器对其进行解码
完后可能会学: tomcat中的自定义类加载器
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
System.out.println(classLoader);
System.out.println(classLoader.getParent());
System.out.println(classLoader.getParent().getParent());

上面代码打印结果

2、java.lang.Class

打印一些示例

Class.class       // class java.lang.Class
String.class      // java.lang.String
int.class         // int
int[].class       // class [I
Override.class    // interface java.lang.Override
Comparable.class  // interface java.lang.Comparable
Field.class       // class java.lang.reflect.Field

2.1、获取Class对象方式

4种

package a.b.c;

public class Cat {
    public static void main(String[] args) {
        // 第1种
        Class c1 = Cat.class;
        System.out.println(c1); // class a.b.c.Cat

        // 第2种
        Class c2 = (new Cat()).getClass();
        System.out.println(c1 == c2); // true

        // 第3种(常用)
        try {
            Class c3 = Class.forName("a.b.c.Cat");
            System.out.println(c1 == c3); // true
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 第4种
        ClassLoader cl = Cat.class.getClassLoader(); // 获取类加载器
        try {
            Class c4 = cl.loadClass("a.b.c.Cat");
            System.out.println(c1 == c4); // true
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

3、反射

3.1、获取本类信息

package a.b.c;

public class Hello {
  public static void main(String[] args) {
    (new Hello()).getThisClass();
  }

  private void getThisClass() {
    Class c = this.getClass();

    System.out.println(c);
    // class a.b.c.Hello

    System.out.println(c.getSimpleName());
    // Hello

    System.out.println(c.getName());
    // a.b.c.Hello

    System.out.println(c.getTypeName());
    // a.b.c.Hello

    System.out.println(c.getPackage());
    // package a.b.c

    System.out.println(c.getResource("/"));
    // file:/C:/Users/yellow/IdeaProjects/JavaProject/out/production/JavaProject/

    System.out.println(c.getResource(""));
    // file:/C:/Users/yellow/IdeaProjects/JavaProject/out/production/JavaProject/a/b/c/

    System.out.println(c.getResource("").getPath());
    // /C:/Users/yellow/IdeaProjects/JavaProject/out/production/JavaProject/a/b/c/
  }
}

3.2、创建任意引用类型的对象

class A {}

public class Hello {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Class.forName("A");
        Object a = clazz.newInstance();
        System.out.println(a);
    }
}

3.3、修改私有属性

import java.lang.reflect.Field;

class A {
    private int aa = 2;
}

public class Hello {
    public static void main(String[] args) throws Exception {
        //1、获取A的Class对象
        Class clazz = Class.forName("A");

        //2、获取属性对象
        Field aField = clazz.getDeclaredField("aa");

        //3、设置允许
        aField.setAccessible(true);

        //4、创建实例对象
        Object a = clazz.newInstance();

        //5、获取属性值
        Object value = aField.get(a);
        System.out.println(value);  //打印结果:2

        //6、修改(设置)属性值
        aField.set(a, 999);
        value = aField.get(a);
        System.out.println(value);  //打印结果:999
    }
}

3.4、调用任意类型的方法

import java.lang.reflect.Method;

class A {
    void methodA(Integer i) { System.out.println("aa" + i); }
}

public class Hello {
    public static void main(String[] args) throws Exception {
        // 1、获取对象
        Class<?> clazz = Class.forName("A");

        //2、获取方法对象
        Method method = clazz.getDeclaredMethod("methodA", Integer.class);

        //3、创建实例对象
        Object a = clazz.newInstance();

        //4、调用方法
        method.invoke(a, 22);  //打印结果:aa22
    }
}

3.5、读取注解信息

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;

//自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation {String value();}

//使用注解
@MyAnnotation("这这这这这这这这这是个注解")
class MyClass {}

public class Hello {
    public static void main(String[] args) {
        // 需求:可以获取MyClass类的注解

        // 1、获取Class对象
        Class<MyClass> clazz = MyClass.class;

        // 2、获取注解对象
        MyAnnotation my = clazz.getAnnotation(MyAnnotation.class);

        // 3、获取配置参数值
        System.out.println(my.value()); //打印结果:这这这这这这这这这是个注解
    }
}
javalang.zip Pure Python Java parser and tools. javalang is a pure Python library for working with Java source code. javalang provides a lexer and parser targeting Java 8. 立即下载

相关推荐

python类似java的反射操作

NULL 博文链接:https://guoshiguan.iteye.com/blog/308674

python解析Java文件三方库javalang用法简介

书接上文,在我一顿操作猛如虎的土鳖扫描后,发现仅仅只是扫描出关键字的话,有些封装后的调用或者将关键字声明称常量后的调用都没法识别出来。这种关键字扫描怎么说呢?有点鸡肋,误报太多,无法聚焦重点。所以我们需要一个识别关键字是否为变量或者封装在那个函数中的能力。这个相当于解析整个Java文件,按照基础的Java文件结构进行归类查询。这种功能其实就是IDE的实现跳转功能,想着这么成熟的技术一定有库的,又去搜索了一波,总算发现了这个宝藏库——javalang。

kiba_zwei的博客 5457

3D高斯溅射融合Gabor滤波器:频率感知如何提升神经渲染效率与质量

在计算机视觉与图形学领域,3D场景重建旨在从多视角图像中恢复真实世界的三维结构与外观。其核心原理是通过优化场景表示,使渲染出的二维图像与输入照片尽可能一致。传统方法在效率与细节保真度间常面临权衡,高频细节(如精细纹理、锐利边缘)的重建尤为消耗算力。频率感知技术为此提供了突破方向,它借鉴信号处理思想,将场景分解为不同空间频率的成分进行针对性建模。Gabor滤波器作为经典的频率-方向分析工具,能有效刻画纹理的局部频域特征。将Gabor的频率选择性与3D高斯溅射(3DGS)这一高效显式表示结合,构成了神经Gabo

weixin_33087827的博客 273

python-javalang抽象语法树

javalang

问题很多的小明 1545

逆向分析踩坑记:当Frida在x86模拟器上‘看不见’ARM的so文件时,我们该如何手动定位与验证?

本文探讨了在x86模拟器上使用Frida进行逆向分析时,无法检测到ARM架构so文件的解决方案。通过分析内存映射、Frida的视觉盲区及手动定位技术,提供了兼容层、混合调试和原生ARM环境三种实用方案,帮助逆向工程师突破工具限制,实现精准定位与验证。

weixin_27697385的博客 224

Docker启动安装nacos(详情讲解,全网最细)

docker安装nacos保姆级教程

ilvjiale的博客 8万+

python脚本寻找Java文件方法

当我们在阅读一段 Java 代码时,有时候需要统计某个 Java 文件中各个方法的行数,并找到最后一个起始行号小于等于给定值的方法。在编写 Python 代码时,我们也应该注重代码的可读性和可维护性,遵循一些基本的编码规范和良好的编程风格,这样有利于提高代码质量和开发效率。至此,我们已经实现了统计 Java 文件中各个方法的行数,并找到最后一个起始行号小于等于给定值的方法的功能。按照方法体的起始行号排序,查找最后一个起始行号小于等于给定值的方法。5.查找最后一个起始行号小于等于给定值的方法。

qq_27963509的博客 2005

Notion卡顿救星:3分钟搞定DNS优化,手机电脑全平台加速指南

本文针对Notion访问慢和卡顿问题,提供了全平台DNS优化与Hosts文件修改的详细指南。通过更换优质DNS服务器或建立静态IP映射,可有效解决因网络延迟和域名解析导致的加载缓慢,实现手机与电脑端的快速加速,提升Notion使用流畅度。

v6b7n8m9q0的博客 1307

python 解析 java文件 --- javalang 模块

提示:javalang包分两段理解:一段是代码片段解析成语法树的过程 一段是语法树节点操作 参考文档:https://github.com/c2nes/javalang 语法树 获取语法树 >>> import javalang >>> tree = javalang.parse.parse("package javalang.brewtab....

qq_21319187的博客 1万+

从毫米波到计算机视觉:智能座舱监控系统的多模态技术融合

本文探讨了智能座舱监控系统中多模态技术融合的创新应用,涵盖毫米波雷达、红外传感与计算机视觉的协同架构。通过传感器时空对齐、低光照算法突破及隐私保护设计,系统在DMS、OMS等场景实现99.7%的检测准确率,同时优化成本至$45以内,为汽车智能化提供关键技术支撑。

d6e7f8的博客 904

常用的数据结构以及常用的算法

常用的数据结构以及常用的算法 常用数据结构 数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。 数据结构往往同高效的检索算法和索引技术有关。 一、线性表 线性结构: 最常用、最简单的一种数据结构。 线性表: 典型的线性结构。基本特点是线性表中的 数据元素有序且有限。结构中: ① 存在一个唯一的被称为“第一个”的数据元素; ② 存在一个唯一的被称为“最后一个”的数据元素; ③ 除第一个元素外,每

qq_47605698的博客 1455

LangChain4j:Java工程师的AI工程范式重构

AI应用开发正从Python单生态走向多语言协同,Java作为企业级系统主力语言,亟需适配大模型时代的工程范式。LangChain4j并非简单移植,而是基于JVM特性重构的AI基础设施层——依托Spring Boot生命周期管理、Record类型安全契约、CompletableFuture原生流式支持,解决Java团队在RAG、Agent编排、工具调用中的类型不安全、状态难管控、审计难落地等核心痛点。其设计直面企业刚需:事务一致性、灰度发布、ELK日志集成与租户隔离,让AI能力可嵌入现有ERP/CRM系统。

weixin_32285357的博客 301

运放单电源供电和双电源供电的实际应用案例

文章摘要:本文对比分析了运放单电源与双电源供电的典型应用场景及电路设计要点。单电源供电适用于低成本、小体积设备,如便携音箱(5V供电+中点偏置)、工业4-20mA信号转换(12V供电+电压跟随)和物联网传感器(3.3V低功耗设计);双电源供电则适合高精度要求场景,如Hi-Fi音响(±15V对称输出)、医疗设备(±5V微弱信号放大)和精密仪器(±15V宽动态范围)。文末提供常见运放选型对照表,涵盖LM324、TL082等型号的供电参数与核心特性,为不同应用场景提供选型参考。(149字)

qq_37999850的博客 612

从 L1 入门到 L4 实战,2026 年网络安全学习路线全解析

本文详解 2026 年网络安全学习路线,从 L1 基础筑基到 L4 红蓝对抗实战。涵盖 Web 渗透、内网安全及 Python 自动化开发,整合 NISP/CISP 证书考取指南与必备工具清单,助开发者系统掌握网安技能,高效进阶高薪岗位。

2503_90953556的博客 431

Android 车载应用之快速入门

车载 Android 系统也被称为 Android Automotive OS,是对原始 Android 系统的一个功能扩充版本。与手机系统一样,Android Automotive OS 源代码完全开放,第三方供应商和汽车制造商可以官方源码的基础上自行开发和拓展,无论是编程语言还是各项接口,都与 Android 系统保持了一致。

xiangzhihong8的专栏 1113

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

从 L1 到 L4,这份网络安全成长路线图帮你系统入门

本文详解网络安全从 L1 到 L4 的系统成长路线图,涵盖基础筑基、渗透测试、内网攻防及红蓝对抗实战。通过整合核心技能树与认证指南,帮助从业者拒绝碎片化学习,快速构建完整知识体系,实现从入门到专家的职业跃迁。

2503_90953556的博客 336

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

用python做java语言的静态分析

我们可以把javalang解析出的语法树进行再加工,生成我们需要的元信息,再结合校验规则,做一些常见编码问题的分析。最近在对java语言做静态分析,发现javalang这个好用的python包。这就是lint类工具的一般性原理。

tlxamulet的博客 927

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

使用python解析Java类

0x00 前言 遇到这样一个基础需求: 需要提取Java中的所有方法 需要过滤所有访问权限为public的方法。 0x01 提取Java中的方法 语言:python 库:javalang 直接使用pip install 安装即可。 直接提供解决方案,中间夹杂了很多测试过程,这里不进行记录。 使用parse模块直接读取,会读取到一个方法,这个方法中的types会存有所有类信息的列表。 tree = javalang.parse.parse(f.read()) 如果是直解析一个类则可以直接选择type

王嘟嘟的博客 4156

python 的 javalang 库【2】

在 前文 的基础上,继续分析以及 Demo 演示 ast.py class MetaNode(type) class Node(object) def walk_tree(root) def dump(ast, file) def load(file) Node 中包括 __ init__(self, **kwargs) filter(self, pattern) 过滤器 __ equals__(self, other) 比较 child

attribute47的博客 1991

python进阶 — 使用python脚本调用java程序

在这个示例中,`command`变量存储了要执行的命令行命令,其中包括Java可执行文件的路径(例如`path/to/your/java/project.jar`)和参数列表(例如`arg1`和`arg2`)。然后,使用`subprocess.run()`函数执行命令行命令,通过`capture_output=True`参数来捕获命令的输出,并使用`text=True`参数将输出解码为文本格式。是的,你可以使用Python的`subprocess`模块通过执行命令行命令来调用Java项目。

个人博客 3382

【亲测免费】 **javalang:纯Python编写的Java源码解析工具**

javalang:纯Python编写的Java源码解析工具 项目基础介绍及编程语言 javalang是一个采用纯Python实现的库,专门用于处理Java源代码。它针对的是Java 8的语法特性,内部遵循了官方Java语言规范(http://docs.oracle.com/javase/specs/jls/se8/html/)。此项目尤其适合那些在Python环境中需要分析或操作Java代码的开发...

gitblog_09566的博客 597

python调用java方法_python如何调用java类

由于 python 本身为脚本语言,且经常存在调用第三方库的情况,有的时候用 java 调用 python 不如用 python 调用 java 方便。下面就整理一下在 python 调用 java 过程中需要哪些操作。(默认是 linux 的 Ubuntu 上调用)首先 linux 上的 jdk 是一定需要安装的,这个过程在这里就不表了,python 都是 linux 自带的,这里默认是 pyt...

weixin_39600319的博客 1031

python和java反射_在python中使用反射(reflection)

反射在编程语言中变广泛的应用,java和php都提供专门的类库,对反射有很好的支持,而python,仿佛天生就支持了反射。反射是在只知道类名或者函数名的情况下调用其对应的函数。广泛应用于:配置文件。路由。例子1:通过import实现module = __import__('person')if hasattr(module, 'Person'):person_cls = getattr(modul...

weixin_36141019的博客 349

安装python的javalang包

要用到javalang进行语法 安装1.下载2.运行总结 1.下载 从github下载源码 https://github.com/c2nes/javalang 2.运行 打开下载的压缩包文件夹并解压 shift+右键 打开powershell窗口 因为我有多个py环境,所以先activate env(如果没有请忽略) 运行安装 python setup.py install activate env python setup.py install 总结 从 GitHub 上手动安装python

JIZHI_QIAN的博客 1563

python 的 javalang 库【1】

javalang 是用于处理 Java 源码的纯 Python 库,目前提供了针对 Java 8 的词法分析器和解析器。PyPI | Github | Java8 语言规范 开始 import javalang tree = javalang.parse.parse("package javalang.brewtab.com; class Test {}; class Test2 {}") 将返回一个 CompilationUnit 实例,它是树的根,可以通过遍历提取不同信息。 print(tree.pa

attribute47的博客 7724
上一篇: Python工程师Java之路(k)文件读写
下一篇: Python工程师Java之路(m)lambda表达式
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值