JAVA反射机制详解

Java反射机制详解 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。......... 阅读详情

反射机制有什么用

可以操作字节码文件

反射机制的相关类再哪个包下?

java.lang.reflect.*;

反射机制相关的类

java.lang.Class   代表字节码文件

java.lang.reflect.Method   代表字节码中的方法的字节码

java.lang.reflect.Constructor   代表字节码中的构造器的字节码

java.lang.reflect.Field   代表字节码中的属性的字节码

利用反射机制操作字节码文件

获取类的字节码

第一种方式:使用静态方法Class.forName(完整类名加包名)

Class c1 = Class.forName("java.lang.String");

Class.forName("java.lang.String");会导致类加载,即执行一次,String方法中的静态代码块也会执行一次,如果想一个类的静态方法执行一次,那么可以使用Class.forName()

第二种方式:使用Object类中的引用.getClass()方法

String s = "abc";
Class c = s.getClass();

第三种方式:java中的任意数据类型(包括基本数据类型)都有class属性

Class c = String.class;
Class c = int.class;

通过字节码文件来实例化对象

public class Test {
    public static void main(String[] args) {
        Class c = null;
        try {
            //通过反射机制获取字节码文件
            c = Class.forName("User");
            //newInstacnce()方法会调用User的无参构造方法来new一个User对象
            //必须保证User的无参构造方法存在!
            Object o = c.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }

    }
}
class User{

}

注意:使用这种方法来初始化对象,更灵活!

举个例子

配置文件

//classinfo.Properties
className=com.sdut.wwg.User

User类

package com.sdut.wwg;

public class User {
    @Override
    public String toString() {
        return "User{}";
    }
}

Test类

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

public class Test {
    public static void main(String[] args) throws Exception{
            //还可以这样获取绝对路径
            /*
            String path = Thread.currentThread().getContextClassLoader()
                .getResource("classinfo.Properities").getPath();
            
            还可以直接返回一个流
            InputStream r =Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("classinfo.Properities");
            */
            FileReader r = new FileReader("Demo/src/classinfo.Properities");
            Properties p = new Properties();
            p.load(r);
            r.close();
            String className = p.getProperty("className");
            //通过反射机制获取字节码文件
            Class c= Class.forName(className);
            //newInstacnce()方法会调用User的无参构造方法来new一个User对象
            //必须保证User的无参构造方法存在!
            Object o = c.newInstance();
            System.out.println(o);


    }
}

这样的优点在于当服务器运行的时候,可以直接修改配置文件,而不需要改代码情况下可以做到不同对象的实例化

反射属性

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;


public class Test {
    public static void main(String[] args) throws Exception{
        Class c = Class.forName("com.sdut.wwg.User");
        //获取完整类名
        System.out.println("完整类名为"+c.getName());
        System.out.println("简类名为"+c.getSimpleName());
        //获取User所有的公共属性
        Field[] fs = c.getFields();
        System.out.println("所有声明公有属性数量总计"+fs.length);

        //获取User所有的属性
        Field[] allFs = c.getDeclaredFields();
        System.out.println("所有声明属性数量总计"+allFs.length);
        System.out.println("属性名为:");
        for (int i = 0; i <allFs.length ; i++) {
            System.out.println(allFs[i].getName());
        }
        System.out.println("各属性类型为:");
        for (int i = 0; i <allFs.length ; i++) {
            //获取属性修饰符
            int s = allFs[i].getModifiers();
            System.out.println(s);
            //可以将这个代号数字转换为字符串
            String modifierString = Modifier.toString(s);
            System.out.println(modifierString);
            //获取属性的类型
            Class fieldType = allFs[i].getType();
            System.out.println(fieldType.getSimpleName());
        }
    }
}




通过反射机制来反编译一个类的属性(了解)

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;


public class Test {
    public static void main(String[] args) throws Exception{
        Class c = Class.forName("User");
        StringBuffer s= new StringBuffer();
        //获取类的修饰符列表和类名
        s.append(Modifier.toString(c.getModifiers())+" class "+c.getSimpleName()+"{\n");
        Field[] fields = c.getDeclaredFields();
        for(Field f:fields){
            s.append("\t"); 
            s.append(Modifier.toString(f.getModifiers())+" ");
            s.append(f.getType().getSimpleName()+" ");
            s.append(f.getName()+";\n");
        }
        s.append("}");
        System.out.println(s);
    }
}

输出结果为

通过访问机制来访问一个java对象的属性

import java.lang.reflect.Field;


public class Test {
    public static void main(String[] args) throws Exception{
        Class c = Class.forName("User");
        Object o = c.newInstance();
        //获取no属性
        Field noField = c.getDeclaredField("no");
        //给o对象的no属性赋值
        noField.set(o,1111);
        //读取属性的值
        System.out.println(noField.get(o));

        //可以访问私有属性吗??
        Field nameField = c.getDeclaredField("name");

        //需要打破封装.这样设置完之后,在外部也是可以访问私有属性的
        nameField.setAccessible(true);
        nameField.set(o,"jack");

        System.out.println(nameField.get(o));
    }
}

反射方法

public class Test {
    public static void main(String[] args) throws Exception{
        Class c = Class.forName("User");
        //获取所有的方法
        Method[] methods = c.getDeclaredMethods();
        //获取获取到的方法数量
        System.out.println(methods.length);
        for(Method m:methods){
            //输出方法的修饰符列表
            System.out.print(Modifier.toString(m.getModifiers())+" ");
            //输出方法的返回值类型
            System.out.print(m.getReturnType().getSimpleName()+" ");
            //输出方法的名字
            System.out.println(m.getName());
            //获取参数
            Class [] ctypes = m.getParameterTypes();
            for(Class clas: ctypes){
                //输出参数的类型
                System.out.println(clas.getSimpleName());
            }
        }
    }
}

反编译方法名和参数列表

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {
    public static void main(String[] args) throws Exception{

        StringBuffer s = new StringBuffer();
        Class c = Class.forName("java.lang.String");
        Method [] methods = c.getDeclaredMethods();
        for(Method m: methods){
            s.append('\t');
            s.append(Modifier.toString(m.getModifiers())+" "+m.getReturnType().getSimpleName()+" "+m.getName());
            s.append(" (");
            Class []classes = m.getParameterTypes();
            for(Class cls : classes){
                s.append(cls.getSimpleName()+',');
            }
            if(classes.length>0)
            s.deleteCharAt(s.length()-1);
            s.append(") { }\n");
        }
        System.out.println(s);
    }
}


输出结果为

 

通过反射机制调用方法

 

import java.lang.reflect.Method;
public class Test {
    public static void main(String[] args) throws Exception{
        Class userClass = Class.forName("User");
        //创建一个User类对象
        Object o = userClass.newInstance();
        //获取sum方法
        Method sum = userClass.getDeclaredMethod("sum", int.class, int.class);

        //调用sum方法
        int result =(int)sum.invoke(o,1,2);
        System.out.println(result);
    }
}

通过反射机制调用有参构造方法


import java.lang.reflect.Constructor;

public class Test {
    public static void main(String[] args) throws Exception{
        Class userClass = Class.forName("User");
        //调用无参构造方法创建对象
        Object o = userClass.newInstance();
        //调用有参构造方法创建对象
        Constructor constructor = userClass.getConstructor(int.class,String.class);
        Object o1 = constructor.newInstance(1111,"jack");

        System.out.println(o);
        System.out.println(o1);
    }
}

输出结果为

通过反射机制获取父类以及实现了什么接口

public class Test {
    public static void main(String[] args) throws Exception{
        Class stringClass = Class.forName("java.lang.String");
        //获取父类名
        Class superClass = stringClass.getSuperclass();
        System.out.println(superClass.getSimpleName());
        //获取实现了什么接口
        Class[] interfaces = stringClass.getInterfaces();
        for(Class i:interfaces){
            System.out.println(i.getSimpleName());
        }
    }
}

输出结果

Grub 程序下载(中文版-2004最终版,支持 gfxmenu)__all_fs_g.tar.bz2 立即下载

相关推荐

UVM和System verilog笔记总结(四)

virtual sequence 即虚seq,用于管理多个实sequence的执行顺序。 下面有三个sequence,此时需要virtual sequence去管理这三个的顺序。 virtual sequence和virtual sequencer需要成对写,使用例化实的sequence和sequencer控制: 此时在virtual sequence里面启动,而不是之前在test.sv里面用default或start函数启动。具体方法如下:先例化 再启动,用 `uvm_do_on 实sequence

weixin_42655118的博客 642

【Java高级】反射(下)

文章目录1.获取Field 1.获取Field

北极星的博客 174

Vivado+VCS+Verdi三件套实战:如何高效仿真AXI VIP并快速查看波形

本文详细介绍了如何利用Vivado+VCS+Verdi工具链高效仿真AXI VIP并快速查看波形。通过环境配置、Vivado工程准备、VCS编译与仿真优化以及Verdi波形分析技巧,实现仿真速度的数量级提升,显著提高FPGA开发效率。

red88的博客 1000

No fieldxx of type I in classxx; or its superclasses (declaration of 'xxx' appears in xx.apk:classes

报错: /MobUncaughtExceptionHandler: No field recycler_view_1111 of type I in class Lcom/dmcbig/mediapicker/R$id; or its superclasses (declaration of 'com.dmcbig.mediapicker.R$id' appears in /data/app/co...

fangjingjingll的专栏 6063

CPU设计实战:Loongarch版 lab6--20条指令单周期CPU

这个debug卡我时间最长的就是通用寄存器的写使能信号,当时一直没找到,甚至把golden—trace生成了一遍又一遍,对照test,检查了各种,卡了很长时间,我都以为是我之前哪一步搞错了,或者环境什么的,但是一步步做下来并没有,并且“机器永远是对的”让我终于查到了错。debug到一半才想起来写个博客,就不写过程了,下个lab再写过程。下面是两个模块的代码,运行已通过仿真验证。其他的bug就还好,如果认真跟着。就能马上找出来,,上面的每一句话都很重要。走,按逻辑检查并且查。

m0_65369544的博客 6302

技术指南| 叶绿体基因组高级分析全流程解析

本文详细解析了叶绿体基因组高级分析的全流程,包括实验设计、序列组装与注释、比较基因组分析、选择压力与功能进化等关键步骤。通过实战案例和技术技巧,帮助研究者掌握叶绿体基因组分析的核心方法,提升植物进化研究和系统学分析的效率与准确性。

weixin_33725239的博客 491

no field package.preload[‘ffi’]

http://lurenzhi.org/luajit-%E4%B8%8Elua-%E7%9A%84%E5%8C%BA%E5%88%AB/ 在openresty中使用luajit,如果出现以下错误,一般是由下面原因造成的。 lua: resty_uid.lua:1: module ‘ffi’ not found:         no field package.preload[‘ffi’

MyDriverC 9488

基于逆向工程的中国裁判文书网爬虫技术深度解析:从反爬破解到合规抓取

最近承接了一个法律大数据分析的项目,需要获取某类合同纠纷的裁判文书数据,用于分析不同地区的判决规律、法官的裁判倾向以及法条适用情况。原本以为用常规的Python爬虫就能搞定,结果刚对着中国裁判文书网发了几个请求,就遭遇了“滑铁卢”:要么请求直接返回403 Forbidden,要么触发滑块验证码,甚至连IP都被临时封禁了。普通的requests+BeautifulSoup组合在裁判文书网面前完全失效,这也让我意识到,想要获取这里的数据,必须先通过逆向工程拆解网站的请求逻辑和反爬机制。经过一周的摸索,从抓包分析

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3169

FFT变换频谱图中幅值的设置方法

按照上篇博文所画出来的频谱图中,原信号的每个频率是准确地找出来了,但是各个频率点所对应的的幅值可不是原信号中真正的幅值,因为在进行DFT(FFT)变换的时候,已经把幅值改变了,要想让频谱图的纵坐标显示为原信号中真正的幅值其实也很简单,代码如下: clear all fs=150;%采样频率要大于等于原信号中最高频率的二倍 N=150; t=(0:N-1)/fs; y=0.5*sin(2*pi*65...

逸凌Time 1万+

微信终于支持“多设备同时在线”?我用 NAS + Docker 搭了一个云端微信系统,多端共享24小时在线

通过Docker 容器,将微信运行在云端并通过浏览器访问,实现多设备共享同一微信会话 📱。本文详细介绍完整部署流程、docker-compose 配置及资源控制方案,让微信变成“可访问的云桌面应用” ✨

XiaoqiangClub的博客 869

RK3588与FocalTech触摸屏代码适配全解析:从原理到实战

摘要:本文详细介绍了瑞芯微RK3588处理器与FocalTech触摸屏的适配过程,包括硬件特性、驱动加载、设备树配置和常见问题解决方案。RK3588作为8nm工艺的高性能处理器,具备强大的计算能力和丰富的接口资源;FocalTech触摸屏则采用电容式技术,支持I2C/SPI接口。适配关键步骤包括驱动程序加载、硬件连接检查、设备树配置和内核版本兼容性处理,并提供了代码示例和问题排查方法。随着嵌入式设备智能化发展,该适配技术将持续优化,为智能交互提供更优解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 272

java反射机制原理详解_反射机制使用详解

原文链接:反射机制使用详解反射机制使用详解反射定义反射API反射对于单例的破坏IOC容器反转控制原理反射的定义java反射机制是java开发中有一个非常重要的概念,也是java的重要特征之一。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以动态调用方法和属性,大部分框架也都是运用反射原理的。比如Spring。首先大家应该先了解...

weixin_39956022的博客 1219

3D结构光 vs TOF——手机厂商为何选择TOF方案?

3D视觉感知技术路线分析:结构光与TOF对比 3D视觉感知领域存在结构光和TOF两大主流技术。结构光基于三角定位法,精度高(毫米级)但工作距离短(<1.5米),适合人脸识别等近距离场景;TOF通过测量光脉冲飞行时间计算深度,精度中等(厘米级)但工作距离长(0.5-5米+),更适合AR导航等中远距离应用。手机厂商选型时考虑:前置认证选择结构光(如苹果FaceID),后置场景倾向TOF(安卓阵营),因后者更适配全面屏设计、环境适应性强且成本优势明显。两种技术互补共存,共同推动3D感知应用发展。

致力于lidar应用开发 111

java 反射机制详解_Java中反射机制详解

这篇文章主要介绍了Java反射机制及Method.invoke详解,本文讲解了JAVA反射机制、得到某个对象的属性、得到某个类的静态属性、执行某对象的方法、执行某个类的静态方法等内容,需要的朋友可以参考下 JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,反射:可以动态的获取指定类中的成员,以及建立类对象。好处:提高了程序的扩展性。张三,李四等这些生活中的对象,可以通过Person...

weixin_31629913的博客 178

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java之反射机制详解

Java反射是一种允许程序在运行时动态检查和操作类内部信息的机制,提供了极大的灵活性和扩展性。它通过`java.lang.reflect`包中的类实现,包括Class、Constructor、Field和Method等核心类。反射机制的应用场景广泛,如框架设计、插件系统、单元测试等。具体实现包括获取Class对象、获取类的信息以及操作类,如创建对象、调用方法和访问字段。此外,反射在处理注解方面也起着关键作用。然而,反射存在性能开销和安全隐患,因此需要谨慎使用,并采取相应的优化和安全措施。

一个老Java开发的自白 1576

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java反射机制详解——超详细

| |目录1反射机制是什么2反射机制能做什么3反射机制的相关API·通过一个对象获得完整的包名和类名·实例化Class类对象·获取一个对象的父类与实现的接口·获取某个类中的全部构造函数 - 详见下例·通过反射机制实例化一个类的对象·获取某个类的全部属性·获取某个类的全部方法·通过反射机制调用某个类的方法·通过反射机制操作某个类的属性·反射机制的动态代理4反射机制的应用实例·在泛型为Integer的...

刘成 4429

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java 基础 - 反射机制详解

本文综合多篇文章后,总结了Java 反射的相关知识,希望可以提升你对Java中反射的认知效率。

qq_63353796的博客 1272

Java中反射机制详解

最近小熙在复习反射相关的知识,碰到一篇还不错的分享下     序言       在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射,所以回过头来把这个给重新补一下,自己欠下的债,迟早是要还的。                             ...

人生到处知何似,应似飞鸿踏雪泥。 251

java反射机制原理详解_java反射机制的详细讲解

一 , 什么是java反射机制?JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。1.意义首先,反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。其次,通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标...

weixin_39998462的博客 3612

JAVA的反射机制详解

首先,大家应该先明白两个概念:编译期和运行期。编译期就是编译器帮你把源代码翻译成机器能执行的文件,比如编译器把java代码编译成jvm能识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行。Java反射(Reflection)就是Java程序在运行时,可以加载、探知、使用编译期间完全未知的类。也就是说,Java可以加载一个运行时才得知类名的类,获得类的完整构造方法,并实例化出对象,给对象...

yechengchao的博客 192
上一篇: path、classpath、java_home等环境变量的作用
下一篇: Java中各类修饰符的使用总结(看完这篇就够了)(转载)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值