javase-reflect-210625-01

除了Arduino IDE,Seeeduino XIAO还能怎么玩?PlatformIO环境搭建与驱动配置全攻略 本文详细介绍了如何在PlatformIO环境中搭建Seeeduino XIAO的开发环境,包括USB串口驱动配置、项目创建与优化技巧。通过对比Arduino IDE,展示了PlatformIO在代码效率、调试功能和项目管理上的优势,帮助开发者充分发挥Seeeduino XIAO的潜力。 阅读详情

javase-reflect-210625-01

  • 反射的理解

反射机制有什么用?

通过java语言中的反射机制可以操作字节码文件
类似于黑客。(可以读和修改字节码文件)
通过反射机制可以操作代码片段(class文件)

反射机制的相关类的包

java.lang.reflect.*;

反射机制的相关的重要类

java.lang.Class					代表整个字节码,代表一个类型。   代表整个类
java.lang.reflect.Method		 代表字节码中的方法字节码。		代表类中的方法
Java.lang.reflect.Constructor	  代表字节码中的构造方法字节码。  代表类中的构造方法
java.lang.reflect.Fidld			 代表字节码中的属性字节码。	    代表类中的成员变量(静态变量,实例变量)

// java.lang.Class:
	public class User{
        
        // Field
    	int no;
        
        // Constructor
        public User(){
            
        }
        public User(int no){
            this.no = no;
        }
        
        // Method
        public void setNo(int no){
            this.no = no;
        }
        public int getNo(){
            return no;
        }
    }

反射实例

01.获取Class

ReflectTest01.java

package bgy_reflect01;
/*
    字节码文件载入到JVM中的时候,只有一份
    要操作一个类的字节码,首先需要获取这个类的字节码文件
    有三种方式获取
        1) Class c = Class.forName("完整的类名带包名");
        2) Class c = 引用.getClass();
        3) Class c = 任何类型.class;
 */

import java.util.Date;

public class ReflectTest01 {
    public static void main(String[] args) {

        /*
            ********************
            ******获取方法01*****
            ********************
            Class.forName()
                1. 静态方法
                2. 方法的参数是一个字符串
                3. 字符串需要的是一个完整类名
                4. 完整类名必须带有包名。java.lang包也不能省略
         */
        Class c1 = null;
        Class c2 = null;
        Class c3 = null;
        Class c4 = null;
        try {
            c1 = Class.forName("java.lang.String");     // c1代表String.class文件,或者c1代表String类型
            c2 = Class.forName("java.util.Date");       // c2代表Data类型
            c3 = Class.forName("java.lang.Integer");    // c3代表Integer类型
            c4 = Class.forName("java.lang.System");     // c4代表System类型
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


        /*
            ********************
            ******获取方法02*****
            ********************
            java中任何一个对象都有getClass()方法
        */
        String s = "bgy";
        Class x = s.getClass();         // x代表String.class字节码文件,x代表String类型
        // 字节码文件载入到JVM中的时候,只有一份,
        // 上面运行到c1的时候就存在了字节码文件String.class,所以这里是true
        // 所以c1 和 x 的内存地址指向的同一个String.class文件
        System.out.println(c1 == x);    // true   “ == ”代表判断的是对象的内存地址

        Date date = new Date();
        Class d = date.getClass();
        // d 和 c2 两个变量中保存的内存地址是一样的,都指向方法区中的字节码文件
        System.out.println(d == c2);    // true


        /*
            ********************
            ******获取方法03*****
            ********************
            java中任何一个对象都有,包括基本类型,都有 .class 属性
        */
        Class t1 = String.class;    // t1代表String类型
        Class t2 = int.class;       // t2代表int类型
        Class t3 = Date.class;      // t3代表Date类型
        Class t4 = double.class;    // t4代表double型
        System.out.println(t1 == c1);   // true
        System.out.println(t3 == d);    // true
    }
}
02.获取的Class能干啥

ReflectTest02.java

package bgy_reflect01;

import bgy_reflect01.bean.People;

/*
    获取Class,干啥????
        可以通过反射,创建对象
        通过Class 的 newInstance()方法来实例化对象
        newInstance() 方法内部实际调用了无参构造方法,必须保证无参构造方法存在
 */
public class ReflectTest02 {
    public static void main(String[] args) {

        // 不通过反射机制创建对象
        // 这种方式的代码写死了,只能创建一个People类型的对象
        People p = new People();
        System.out.println(p);      // bgy_reflect01.bean.People@1b6d3586

        // 通过反射机制创建对象
        try {
            Class c = Class.forName("bgy_reflect01.bean.People");       // c代表People类型

            // newInstance() 这个方法会调用People的无参构造方法,完成对对象的创建
            // newInstance() 调用的是无参构造,必须保证无参构造存在!!!!!!
            // 如果没有无参构造方法,会出现“实例化异常”
            Object o = c.newInstance();
            System.out.println(o);        // bgy_reflect01.bean.People@4554617c

            People people = (People)o;
            System.out.println(people);   // bgy_reflect01.bean.People@4554617c

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}

03.反射的灵活性

ReflectTest03.java

package bgy_reflect01;

import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

/*
    反射灵活性
    java代码写一遍,在不改变java源码的基础上,可以做到不同对象的实例化
    符合OCP原则:对扩展开放,对修改关闭
 */
public class ReflectTest03 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException {

        // 代码不需要改变,只需要修改配置文件,就可以创建出不同的实例对象
        // 通过IO读取People.properties文件
        FileReader reader = new FileReader("src/bgy_reflect01/bean/People.properties");
        // 创建属性类对象Map
        Properties properties = new Properties();
        // 加载
        properties.load(reader);
        // 关闭流
        reader.close();

        // 通过key获取value
        // Properties对象的key和value都是String类型的
        String className = properties.getProperty("className");
        System.out.println(className);

        // 通过反射机制实例化对象
        Class c = Class.forName(className);
        Object obj = c.newInstance();
        System.out.println(obj);
    }
}
04.Class.forName()干了啥?
package bgy_reflect01;
/*
    Class.forName()发生了什么????
        Class.forName() 方法会导致 类加载

    所以说如果只希望一个类的静态代码块执行,其他代码不执行,
    就可以使用:
        Class.forName("完整类名");
    这个方法执行会导致类加载,类加载时,静态代码块执行
 */

public class ReflectTest04 {
    public static void main(String[] args) {

        try {

            // Class.forName() 方法会导致 类加载
            Class c = Class.forName("bgy_reflect01.MyClass");   // MyClass的静态代码块执行!!!

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}

class MyClass{

    // 静态代码块在类加载时执行,只执行一次
    static{
        System.out.println("MyClass的静态代码块执行!!!");
    }
}
05.获取文件路径
1) 获取路径

ReflectTest05.java

package bgy_reflect01;

import java.io.FileNotFoundException;
import java.io.FileReader;

/*
    获取文件路径问题
    下面代码获取文件的绝对路径,即使换了操作系统(mac,linux等),依旧可以获取绝对路径
    但是,获取的前提必须是:文件需要在类路径下,才能使用
 */
public class ReflectTest05 {
    public static void main(String[] args) throws FileNotFoundException {
        /*
            这种方式只有在IDEA中有效,可能换一个ide,它的默认根路径就不是project的根了
            IDEA 中默认的当前路径是project的根
            这种方式移植性差
         */
//        FileReader reader = new FileReader("bgy_reflect01/bean/People.properties");


        /*
            以下这种方式,代码即使换路径了,这样编写依旧通用
            
            以下方式前提:这个文件必须在类路径下,
            即src路径下,
            src就是类的根路径
         */
        // Thread.currentThread() 当前线程
        // getContextClassLoader() 线程对象方法,获取当前线程的类加载器对象
        // getResource() 获取资源,类加载器对象的方法,档期线程的类加载器默认从类的根路径下加载资源
        // 拿到一个文件的绝对路径(从类的根路径下作为起点开始)
        String path = Thread.currentThread().getContextClassLoader()
                .getResource("bgy_reflect01/bean/People.properties").getPath();
        System.out.println(path);
    }
}
2) IO+Properties方法获取
package bgy_reflect01;

import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class IOPropertiesTest {
    public static void main(String[] args) throws IOException {

        // 方法01
        // 获取文件的绝对路径
//        String path = Thread.currentThread().getContextClassLoader()
//                .getResource("bgy_reflect01/bean/People.properties").getPath();
//        FileReader reader = new FileReader(path);

        // 方法01
        // 获取文件的绝对路径
        // 直接以流的形式返回
        InputStream reader = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("bgy_reflect01/bean/People.properties");

        // 获取属性类Map集合
        Properties properties = new Properties();
        // 加载流
        properties.load(reader);
        // 关闭流
        reader.close();
        String className = properties.getProperty("className");
        System.out.println(className);
    }
}
3) ResourceBundle获取
package bgy_reflect01;

import java.util.ResourceBundle;

/*
    资源绑定器获取配置资源
    java.util包下提供了一个资源绑定器,便于获取属性配置文件中的内容
    使用下面的方式,属性配置文件xxx.properties必须放在类路径下,即src目录下
 */
public class ResourceBundleTest {
    public static void main(String[] args) {

        // 资源绑定器,只能绑定xxx.properties文件,并且这个文件必须在类路径下
        // 文件扩展名必须是properties
        // 写路径名的时候,路径后面不用谢扩展名  bgy_reflect01/bean/People
        ResourceBundle bundle = ResourceBundle.getBundle("bgy_reflect01/bean/People");

        String className = bundle.getString("className");
        System.out.println(className);
    }
}

我的项目目录结构

People.java
package bgy_reflect01.bean;

public class People {
    public People() {
        System.out.println("这是无参构造方法");
    }
}
People.properties
className=bgy_reflect01.bean.People
【反射机制】Java中的反射机制,使用反射机制创建对象、访问属性、方法、构造方法等 这篇文章主要是整理了Java中的反射机制,包括:反射机制概念、反射机制访问构造方法、反射机制访问普通方法、反射机制访问属性,反射机制访问修饰符。 文章包含的源代码地址如下: 这里写Gitee源代码地址 一、反射机制概念 二、反射机制使用 (1)加载 ... 阅读详情

相关推荐

AG16K MCU ARM Cortex M3

其中,Input文件为Keil生成的mcu程序文件,输出为合成后的存储格式Bin文件,Program address 为上方表格中“程序运行 RAM 地址(4bytes)”,即 Keil 中设置的程序运行地址。其中 MCU 程序的地址,根据 mcu.ip 中设置的 FLASH_BIAS 进行设置。AG16K MCU 的 FPGA 工程中,需调用 alta_mcu_m3 的硬核 IP,包含在 alta_sim.v 的库文。Quartus II。//MCU 程序在 FLASH 中存放的首地址。

Embeded_FPGA的博客 1806

JAVA的newInstance()和new的区别(JAVA反射机制,通过类名来获取该类的实例化对象)

1.在初始化一个类,生成一个实例的时候;newInstance() 和 new 有什么区别?      用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩、可扩展,可重用等软件思想上解释了。      Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具...

weixin_39935887的博客 4545

从理论到实践:基于Zemax的高分辨率生物显微镜光学系统仿真与优化指南

本文详细介绍了基于Zemax的高分辨率生物显微镜光学系统仿真与优化全流程。从阿贝分辨率公式、柯勒照明等理论基础出发,逐步讲解Zemax建模、像差优化、制造可行性分析等核心步骤,并提供常见问题解决方案。通过实际案例展示如何将理论设计转化为可制造的优化方案,帮助工程师掌握从仿真到实际应用的关键技术。

weixin_29229989的博客 481

通过反射来创建对象,newInstance()和getConstructor()

通过类对象调用newInstance()方法,适用于无参构造方法:如:String.class.newInstance() 通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,适用于无参和有参构造方法。例如:String.class.getConstructor(St

lambert_Lei的专栏 5014

OK3588-C开发板Forlinx Desktop系统烧录与多媒体功能实战

本文详细介绍了OK3588-C开发板Forlinx Desktop系统的烧录步骤与多媒体功能实战。从硬件准备到软件工具配置,逐步解析RKDevTool烧录技巧,并深入测试摄像头、视频编解码及音频功能,帮助开发者快速掌握RK3588芯片的强大性能与Ubuntu系统的优化应用。

weixin_29190169的博客 417

用Multisim仿真一个9V供电的双工对讲机:从电桥原理到LM1875功放调试全记录

本文详细介绍了使用Multisim仿真9V供电的双工对讲机全过程,涵盖电桥原理、NE5532前置放大设计、LM1875功放调试及双工通信实现。通过实战案例解析,帮助读者掌握模拟电路设计与调试技巧,提升电子工程实践能力。

weixin_28678831的博客 115

Java基础题(七)

Makasa 哇!今天刷题是真的累!心思没有集中!明天要加油! 完事惹,回宿舍继续做运动!瘦回88斤啦啦啦! 1.在JAVA中,下面关于String类和StringBuffer类的描述正确的是那一个?(A) A. StringBuffer类的对象调用toString()方法将返回String类型的结果 B. 两个类都有append()方法 C. 可以直接将字符串“test”赋值给声明的String...

Mikasa的博客 7624

逆向解析抖音核心校验参数:bd-ticket-guard-client-data的Python生成逻辑

本文深入解析了抖音核心校验参数bd-ticket-guard-client-data的生成逻辑,详细介绍了其动态证书生成、非对称加密机制及Python实现方法。通过逆向分析,揭示了抖音安全体系的双层验证机制,包括RSA密钥对生成、证书签名及时间戳校验等关键技术要点,为开发者提供了一套完整的参数生成解决方案。

weixin_26642481的博客 408

java中类和实例化_Java中类的初始化与实例化

一个Java对象的创建过程往往包括类初始化和类实例化两个阶段。一、Java对象创建时机我们知道,一个对象在可以被使用之前必须要被正确地实例化。在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象,这种方式在Java规范中被称为 :由执行类实例创建表达式而引起的对象创建。除此之外,我们还可以使用反射机制(Class类的newI...

weixin_29341975的博客 600

基于Codex Skill的抖音爆款分析与带货视频自动化生成实战

这次我们来看一个基于 Codex 的自动化内容创作项目。核心是利用 Codex 平台的能力,通过自定义的 Skill(技能)来拆解抖音爆款博主的视频模式,并自动生成自己的带货视频。对于内容创作者、电商运营或对短视频自动化感兴趣的技术开发者来说,这是一个将大语言模型(LLM)能力与具体业务场景深度结合的实战案例。 项目的核心价值在于流程自动化。它试图解决一个常见痛点:分析爆款视频的脚本结构、话术、节奏需要大量人工,而模仿创作又耗时费力。通过 Codex 的 Skill 机制,可以将“分析”和“生成”这两个环节

weixin_30420305的博客 383

PGM-Explainer实验总结

PGM-Explainer建立了一个概率图模型,为GNN提供实例级解释。 论文标题:PGM-Explainer: Probabilistic Graphical Model Explanations for Graph Neural Networks 论文地址:2010.05788.pdf (arxiv.org) PGM-Explainer实验 实验目的 研究PGM-Explainer的有效性 实验方案 合成数据集的节点分类 与其他解释器做对比实验 使用六个合成数据集。 每个输入图都是一个

笔记|思路|总结 1万+

JAVA反射机制分析-------spring的通过反射创建bean实例对象以及属性注入的原理解析

JAVA反射机制 java反射机制是在运行状态中,对于任意一个类, 能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。 巧妙的利用java中的反射机制,能够帮助我们进行程序开发时达到意想不到...

拱白菜的猪的博客 1万+

Qt入门教程100篇(已完结)

Qt5入门教程,Qt6入门教程。包含了: Qt环境搭建篇、Qt数据类型篇、Qt中STL篇、Qt核心篇、Qt核心对象QObject篇、Qt基础控件篇、Qt对话框篇、Qt高级控件篇、Qt数据模型篇、QSS篇、Qt文件篇 、Qt硬件编程、Qt的一些demo、Qt项目开发篇。......

小鱼酱的博客 15万+

javase-io-210509-02

javase-io-210509-02 File FIle Fiel 1、 File类和四大家族没有关系,所以FIle类不能完成对文件的读和写 2、 FIle对象代表 文件和目录路径名的抽象表示形式 C:\bgy 这是一个文件 C:\bgy\bgy.txt 这也是一个文件 Demo01.java import java.io.File; import java.io.IOException; public class Demo01 { public static v

白光一的博客 286

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

javase-collection-210623-02

javase-collection-210623-02 HashTable Properties HasTableTest01.java package bgy_hashtable01; import java.util.Hashtable; import java.util.Map; /* 1. HashTable中的方法都带有synchronized关键字,是线程安全的 线程安全目前有其它方案,HashTable对线程的处理导致效率较低,所以使用较少 2

白光一的博客 275

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

javase-collection-210619-01

javase-collection-210619-01 Collection------remove() 在集合中使用remove()方法,会使得集合的结构发生改变,如果此时迭代器还是原来的那个,会报错 例子:CollectionTest02.java 1. 如果使用集合的remove()方法进行删除,要通知迭代器更新,否则报错 2. 或者使用迭代器的remove()方法进行删除 CollectionTest01.java package bgy_test_2161901; import j

白光一的博客 253

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

javase-collection-210408-01

javase-collection-210408-01 什么是集合 集合继承图 Collection常用方法 集合遍历迭代 contains方法 什么是集合 集合就是一个容器,数组就是一个集合,它可以来容纳其他类型的数据 集合不能直接存储基本类型的数据,另外集合也不能直接存储java对象, 集合当中存储的都是java对象的内存地址,或者说是集合中存储的引用 注:集合在java中本身是一个容器,是一个对象,集合中任何时候储存的都是引用 在java中每一个不同的集合,底层会对应不同的数据结构。往不

白光一的博客 250

javase-io-210510-02

javase-io-210510-02 IO+Properties 读取配置文件 读取配置文件 IO + Properties Properties 是一个Map集合,key和value都是String类型 经常变的数据,可以单独写到一个文件中,让程序动态读取 那么我们就需要配置文件了,java规范中要求,属性的配置文件建议以 .properties 结尾,,但不是必须是 Demo01.java package com.bgy02; import java.io.FileNotFoundE

白光一的博客 240

javase-collection-210623-01

javase-collection-HashMap-210623-01 HashMap HashMapTest01.java package bgy_hashmap01; /* 1. HashMap底层用的是 哈希表/散列表 的数据结构 1)哈希表是一个数组和单向链表的结合体 2)它是一个一维数组,数组中每一个元素是一个单向链表 3)数组:查询效率高,随机增删效率低 4)单向链表:随机增删效率高,查询效率低 1)

白光一的博客 234

javase-collection-210620-01

javase-collection-210620-01 List ArrayList ListTest01.java package bgy_list_01; import java.util.*; /* 1. List 特点: 有序可重复 1)有序:List集合中的元素有下标 从0开始,以1递增 2)可重复:存一个‘bgy’,还能再存一个‘bgy’ 2. List是Collection的子接口

白光一的博客 230

javase-collection-210624-01

javase-collection-210624-01 TreeSet Collections工具类 TreeSetTest01.java package bgy_treeset01; /* 1. TreeSet 集合底层实际上是一个TreeMap 2. TreeMap集合底层是一个二叉树 3. 放到TreeSet集合中的元素,等同于放到TreeMap集合key部分了 4. TreeSet集合 无序不可重复,可以按照元素的大小顺序自动排序,

白光一的博客 228

javase-io-210508-01

javase-io-210508-01 什么是IO IO分类 Java中IO四个部落 需要知道 1、什么是IO流 ​ I:Input ​ O:Output ​ 通过IO完成对硬盘文件的读和写 2、IO分类 1. 按照 流 的方式进行分类 以内存为参照物 往内存中去,叫做输入(Input),也叫读(Read) 从内存中出来,叫做输出(Output),也叫做写(Write) 2. 按照读取数据方式进行分类 一、 按照 字节方式

白光一的博客 217

javase-annotation-210710-01

javase-annotation-210710-01 注解解释 元注解 Retention源码 Target源码 注解解释 1) 注解 也叫注释,Annotation 2) 注解Annotation是一种引用数据类型,编译之后也是生成xxx.class文件 3) 自定义注解,语法如下: [修饰符列表] @interface 注解类型名{ } 4) 注解如何使用?在哪里使用? 注解使用语法格式: @注解类型名 注解可以出现在类上,属性上,方法上,变量上等

白光一的博客 211

javase-annotation-210710-02

javase-annotation-210710-02 注解中可以用的属性类型 反射获取类上的注解 反射获取类中方法上的注解 注解实例 注解中可以用的属性类型 MyAnnotation0301.java package bgy_annotation_02; public @interface MyAnnotation0301 { /* 注解当中的属性可以是哪种类型 byte short int long float double bool

白光一的博客 209
上一篇: javase-javabase-210127-01
下一篇: javase-reflect-210709-01
白光一
博客等级 码龄9年 0粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值