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

第十六章总结:反射和注解

.1.1:访问构造方法 

反射:

1.class类

2.获取构造方法

3.获取成员属性

4.获取成员方法

注解

1.内置注解

2.反射注解

3

创建Class对象的三种方式

1.使用getClass()方法

object str = new object();

class c = str.getClass()

    Demo1 d1 = new Demo1();
        Class c1 = d1.getClass();
2.使用.class属性

class c = object.class

Class c2 = Demo1.class;
3.使用class类的forname方法

class c = class.forname("全路径")

    
        Class c3 = Class.forName("com.mr.Demo1");


创建class,包会自动创建 

 
package com.mr;
public class Demo1 {
    String s;
    int i, i2, i3;
    private Demo1() {
    }
    protected Demo1(String s, int i) {
        this.s = s;
        this.i = i;
    }
    public Demo1(String... strings) throws NumberFormatException {
        if (0 < strings.length)
           i = Integer.valueOf(strings[0]);
        if (1 < strings.length)
           i2 = Integer.valueOf(strings[1]);
        if (2 < strings.length)
           i3 = Integer.valueOf(strings[2]);
    }
    
    public void print() {
        // TODO Auto-generated method stub
        System.out.println("s=" + s);
        System.out.println("i=" + i);
        System.out.println("i2=" + i2);
        System.out.println("i3=" + i3);
    }
}
//例题16.1

import java.lang.reflect.Constructor;
import com.mr.Demo1;
 
public class ConstructorDemo1 {
    public static void main(String[] args) {
        Demo1 d1 = new Demo1("10", "20", "30");
        Class<? extends Demo1> demoClass = d1.getClass();
        // 获得所有构造方法
        Constructor[] declaredConstructors = demoClass.getDeclaredConstructors();
        for (int i = 0; i < declaredConstructors.length; i++) { // 遍历构造方法
            Constructor<?> constructor = declaredConstructors[i];
            System.out.println("查看是否允许带有可变数量的参数:" + constructor.isVarArgs());
            System.out.println("该构造方法的入口参数类型依次为:");
            Class[] parameterTypes = constructor.getParameterTypes(); // 获取所有参数类型
            for (int j = 0; j < parameterTypes.length; j++) {
                System.out.println(" " + parameterTypes[j]);
            }
            System.out.println("该构造方法可能抛出的异常类型为:");
            // 获得所有可能抛出的异常信息类型
            Class[] exceptionTypes = constructor.getExceptionTypes();
            for (int j = 0; j < exceptionTypes.length; j++) {
                System.out.println(" " + exceptionTypes[j]);
            }
            Demo1 d2 = null;
            try { // 如果该成员变量的访问权限为private,则抛出异常,即不允许访问
                if (i == 2) // 通过执行默认没有参数的构造方法创建对象
                    d2 = (Demo1) constructor.newInstance();
                else if (i == 1)
                    // 通过执行具有两个参数的构造方法创建对象
                    d2 = (Demo1) constructor.newInstance("7", 5);
                else { // 通过执行具有可变数量参数的构造方法创建对象
                    Object[] parameters = new Object[] { new String[] { "100", "200", "300" } };
                    d2 = (Demo1) constructor.newInstance(parameters);
                }
            } catch (Exception e) {
                System.out.println("在创建对象时抛出异常,下面执行setAccessible()方法");
                constructor.setAccessible(true); // 设置为允许访问
            }
            if (d2 != null) {
                d2.print();
                System.out.println();
            }
        }
 
    }
}
 

 16.1.2:访问成员变量

package com.mr;
 
public class Demo2 {
    int i;
    public float f;
    protected boolean b;
    private String s;
}
import java.lang.reflect.Field;
import com.mr.Demo2;
 
public class FieldDemo {
    public static void main(String[] args) {
        Demo2 example = new Demo2();
        Class exampleC = example.getClass();
        // 获得所有成员变量
        Field[] declaredFields = exampleC.getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) { // 遍历成员变量
            Field field = declaredFields[i];
            System.out.println("名称为:" + field.getName()); // 获得成员变量名称
            Class fieldType = field.getType(); // 获得成员变量类型
            System.out.println("类型为:" + fieldType);
            boolean isTurn = true;
            while (isTurn) {
                // 如果该成员变量的访问权限为private,则抛出异常,即不允许访问
                try {
                    isTurn = false;
                    // 获得成员变量值
                    System.out.println("修改前的值为:" + field.get(example));
                    if (fieldType.equals(int.class)) { // 判断成员变量的类型是否为int型
                        System.out.println("利用方法setInt()修改成员变量的值");
                        field.setInt(example, 168); // 为int型成员变量赋值
                    } else if (fieldType.equals(float.class)) { // 判断成员变量的类型是否为float型
                        System.out.println("利用方法setFloat()修改成员变量的值");
                        field.setFloat(example, 99.9F); // 为float型成员变量赋值
                        // 判断成员变量的类型是否为boolean型
                    } else if (fieldType.equals(boolean.class)) {
                        System.out.println("利用方法setBoolean()修改成员变量的值");
                        field.setBoolean(example, true); // 为boolean型成员变量赋值
                    } else {
                        System.out.println("利用方法set()修改成员变量的值");
                        field.set(example, "MWQ"); // 可以为各种类型的成员变量赋值
                    }
                    // 获得成员变量值
                    System.out.println("修改后的值为:" + field.get(example));
                } catch (Exception e) {
                    System.out.println("在设置成员变量值时抛出异常," + "下面执行setAccessible()方法!");
                    field.setAccessible(true); // 设置为允许访问
                    isTurn = true;
                }
            }
            System.out.println();
        }
    }
}

16.1.3:访问成员方法

 
 
package com.mr;
 
public class Demo3 {
    static void staticMethod() {
        System.out.println("执行staticMethod()方法");
    }
 
    public int publicMethod(int i) {
        System.out.println("执行publicMethod()方法");
        return i * 100;
    }
 
    protected int protectedMethod(String s, int i) throws NumberFormatException {
        System.out.println("执行protectedMethod()方法");
        return Integer.valueOf(s) + i;
    }
 
    private String privateMethod(String... strings) {
        System.out.println("执行privateMethod()方法");
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < strings.length; i++) {
            stringBuffer.append(strings[i]);
        }
        return stringBuffer.toString();
    }
}
 
import java.lang.reflect.*;
 
import com.mr.Demo3;
 
public class MethondDemo {
    public static void main(String[] args) {
        Demo3 demo = new Demo3();
        Class demoClass = demo.getClass();
        // 获得所有方法
        Method[] declaredMethods = demoClass.getDeclaredMethods();
        for (int i = 0; i < declaredMethods.length; i++) {
            Method method = declaredMethods[i]; // 遍历方法
            System.out.println("名称为:" + method.getName()); // 获得方法名称
            System.out.println("是否允许带有可变数量的参数:" + method.isVarArgs());
            System.out.println("入口参数类型依次为:");
            // 获得所有参数类型
            Class[] parameterTypes = method.getParameterTypes();
            for (int j = 0; j < parameterTypes.length; j++) {
                System.out.println(" " + parameterTypes[j]);
            }
            // 获得方法返回值类型
            System.out.println("返回值类型为:" + method.getReturnType());
            System.out.println("可能抛出的异常类型有:");
            // 获得方法可能抛出的所有异常类型
            Class[] exceptionTypes = method.getExceptionTypes();
            for (int j = 0; j < exceptionTypes.length; j++) {
                System.out.println(" " + exceptionTypes[j]);
            }
            boolean isTurn = true;
            while (isTurn) {
                try {// 如果该方法的访问权限为private,则抛出异常,即不允许访问
                    isTurn = false;
                    if ("staticMethod".equals(method.getName()))
                        method.invoke(demo); // 执行没有入口参数的方法
                    else if ("publicMethod".equals(method.getName()))
                        System.out.println("返回值为:" + method.invoke(demo, 168)); // 执行方法
                    else if ("protectedMethod".equals(method.getName()))
                        System.out.println("返回值为:" + method.invoke(demo, "7", 5)); // 执行方法
                    else if ("privateMethod".equals(method.getName())) {
                        Object[] parameters = new Object[] { new String[] { "M", "W", "Q" } }; // 定义二维数组
                        System.out.println("返回值为:" + method.invoke(demo, parameters));
                    }
                } catch (Exception e) {
                    System.out.println("在执行方法时抛出异常," + "下面执行setAccessible()方法!");
                    method.setAccessible(true); // 设置为允许访问
                    isTurn = true;
                }
            }
            System.out.println();
        }
    }
}


 

相关文章:

第十六章总结:反射和注解

.1.1&#xff1a;访问构造方法 反射&#xff1a; 1.class类 2.获取构造方法 3.获取成员属性 4.获取成员方法 注解 1.内置注解 2.反射注解 3 创建Class对象的三种方式 1.使用getClass&#xff08;&#xff09;方法 object str new object&#xff08;&#xff09;…...

mysql 切割字符串函数

93、mysql 切割字符串函数 需求&#xff0c;使用in 匹配多个参数&#xff0c;name字段值类型&#xff1a;1234(小明) 结果&#xff1a; select * from user where SUBSTRING_INDEX(REPLACE(name, ), ), (, -1) in ( 小明,小李)使用的函数如下 1、使用SUBSTRING_INDEX函数 SU…...

汽车发动机电机右盖设计

摘要 随着我国微型电子技术和社会经济的发展&#xff0c;目前行业内为满足客户需求出现了大量的电器设备&#xff0c;而大多数的电气设备的重要组成中都有电机&#xff0c;并且电机端盖成为电机研发人员重点关注和研究的对象&#xff0c;逐渐成为电机的重要组成部分&#xff0c…...

ETHERNET/IP从站转CANOPEN主站连接AB系统的配置方法

你还在为配置网关的ETHERNET/IP从站和CANOPEN主站发愁吗&#xff1f;今天来教你解决办法&#xff01; 一&#xff0c;首先&#xff0c;配置网关的ETHERNET/IP从站&#xff0c;需要使用AB系统的配置方法&#xff0c;具体步骤如下 1&#xff0c;使用 AB 系统配置网关的 ETHERNET/…...

人工智能和机器学习:走向智能未来的关键

人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;是当今IT领域中最令人振奋的发展方向之一。从自动驾驶汽车到智能助手&#xff0c;AI技术的应用正在不断扩展&#xff0c;重新定义着我们的生活方式和商业模式。在这个文章中&#xff0c;我们将深入探讨…...

openGauss本地Centos7.6单机安装和简单应用

openGauss本地Centos7.6单机安装和简单应用 openGauss基础环境配置openGauss安装openGauss使用测试openGauss常用命令 openGauss基础环境配置 在VMware Workstation中安装一台 centos7.6 内存&#xff1a;8GB&#xff0c;亲测4GB安装不够 磁盘&#xff1a;测试50GB-100GB够用 …...

LeetCode--1 两数之和

文章目录 1 题目描述2 解题思路2.1 暴力破解2.2 使用 Map 1 题目描述 给定一个整数数组 nums 和一个整数目标值 target, 请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标 你可以假设每种输入只会对应一个答案。但是, 数组中同一个元素在答案里不…...

Hafnium安全分区管理器和示例参考软件栈

安全之安全(security)博客目录导读 目录 一、安全分区管理器 1、术语 2、对旧平台的支持 二、示例参考软件栈 一、安全分区管理器 安全分区管理器的三种实现在TF-A代码库并存&#xff1a; 1.基于FF-A规范的S-EL2 SPMC&#xff08;SPM Core&#xff09;&#xff0c;使能安全…...

Python解读市场趋势:LSTM 和 GRU 在预测 Google 股价方面的探索

我将向您展示如何使用 LSTM 和 GRU 预测股票价格。 导入库 import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt import matplotlib.dates as mdates import plotly.express as pxfrom keras.preprocessing.sequence import Timese…...

vue源码分析(二)——vue的入口发生了什么

文章目录 前言&#xff08;1&#xff09;vue 项目构建的时候&#xff0c;通过package.json文件看到构建入口&#xff08;2&#xff09; 构建入口页面&#xff1a;导入同级模块config的getAllbuilds方法&#xff08;3&#xff09; 通过传入参数中的builds对象使用map获取&#x…...

系统架构师论文总结【持续更新】

系统架构师考试是对计算机从业人员&#xff0c;以考代评的重要考试&#xff0c;近几年一直在参加考试&#xff0c;屡战屡败&#xff0c;后又屡败屡战&#xff0c;记录总结论文相关的知识点&#xff0c;方便考前查看。 一、2010年论文 1&#xff09;论软件的静态演化和动态演化…...

STM32-LCD中英文显示及应用

目录 字符编码 ASCII码&#xff08;8位&#xff09; 中文编码&#xff08;16位&#xff09; GB2312标准 GBK编码 GB18030标准&#xff08;32位&#xff09; Big5编码 Unicode字符集和编码 UTF-32&#xff08;32位&#xff09; UTF-16&#xff08;16位/32位&#xff0…...

13.4web自动化测试(Selenium3+Java)

一.定义 用来做web自动化测试的框架. 二.特点 1.支持各种浏览器. 2.支持各种平台(操作系统). 3.支持各种编程语言. 4.有丰富的api. 三.工作原理 四.搭环境 1.对照Chrome浏览器版本号,下载ChromeDriver,配置环境变量,我直接把.exe文件放在了jdk安装路径的bin文件夹下了(j…...

P1966 [NOIP2013 提高组] 火柴排队

洛谷的一道原题&#xff0c;方法有很多&#xff0c;树状数组以及排序&#xff0c;对刚学树状数组的人来说用排序会比较好理解。 本题最重要的结论就是&#xff0c;要保证两个数组中相同位置的差最小&#xff0c;但是不一定两个数组中数值相同&#xff0c;所以只需要保证相同位…...

Linux文件I/O

下面的内容需要了解系统调用&#xff0c;可看下面的链接&#xff1a; 系统调用来龙去脉-CSDN博客 1.底层文件IO和标准IO 这里指的是操作系统提供的IO服务&#xff0c;不同于ANSI建立的标准IO。 底层IO和标准IO各自所使用的函数&#xff1a; 区别&#xff1a; 1.底层文件IO不…...

卡巴斯基2009杀毒软件

下载地址&#xff1a;https://user.qzone.qq.com/512526231/main https://user.qzone.qq.com/3503787372/main...

Docker 容器服务的注册、发现及Docker安全

目录 Docker容器服务的注册和发现 1、什么是服务注册与发现&#xff1f; 2、什么是consul consul的部署 1、环境准备 2、部署consul服务器 1&#xff09;建立 Consul 服务 2&#xff09;设置代理&#xff0c;在后台启动 consul 服务端 3&#xff09;查看集群信息 4&a…...

UE5 Blueprint发送http请求

一、下载插件HttpBlueprint、Json Blueprint Utilities两个插件是互相依赖的&#xff0c;启用&#xff0c;重启项目 目前两个是Beta的状态&#xff0c;如果你使用的平台支持就可以使用&#xff0c;我们的项目因为需要取Header的值&#xff0c;所有没法使用这两个插件&#xff0…...

SpringBoot 分布式验证码登录方案

前言 为了防止验证系统被暴力破解&#xff0c;很多系统都增加了验证码效验&#xff0c;比较常见的就是图片二维码&#xff0c;业内比较安全的是短信验证码&#xff0c;当然还有一些拼图验证码&#xff0c;加入人工智能的二维码等等&#xff0c;我们今天的主题就是前后端分离的…...

vite.config.js文件配置代理设置VITE_APP_BASE_API

.env.development文件 ENV development # base api VITE_APP_BASE_API /dev-api.env.production文件 ENV production # base api VITE_APP_BASE_API /apidefine: {process.env: {VITE_APP_BASE_API: https://xxx.com}},server: {hmr: true, // vue3 vite配置热更新不用手动…...

如何用douyin-downloader免费批量下载抖音视频:完整指南

如何用douyin-downloader免费批量下载抖音视频&#xff1a;完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback sup…...

开箱即用的AI画质增强方案:超清画质增强镜像功能体验与测评

开箱即用的AI画质增强方案&#xff1a;超清画质增强镜像功能体验与测评 1. 引言&#xff1a;为什么需要AI画质增强&#xff1f; 1.1 数字图像面临的挑战 在数字时代&#xff0c;我们每天都会接触到大量低质量图像&#xff1a;老照片褪色模糊、网络图片压缩严重、监控视频分辨…...

MogFace人脸检测模型-WebUI部署教程:从Docker镜像拉取到7860端口访问全链路

MogFace人脸检测模型-WebUI部署教程&#xff1a;从Docker镜像拉取到7860端口访问全链路 1. 服务简介与核心价值 你是不是经常需要从一堆照片里找出人脸&#xff1f;或者想给自己的应用加个人脸检测功能&#xff0c;但又觉得模型部署太复杂&#xff1f;今天要介绍的MogFace人脸…...

开源AI镜像实测:Pixel Fashion Atelier在A10/A100服务器部署记录

开源AI镜像实测&#xff1a;Pixel Fashion Atelier在A10/A100服务器部署记录 1. 项目概览 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工作站&#xff0c;它采用独特的复古日系RPG界面风格&#xff0c;将AI图像生成过程转化为富有游戏感的交互体…...

多模态扩展:OpenClaw调用Qwen3-32B实现截图内容分析

多模态扩展&#xff1a;OpenClaw调用Qwen3-32B实现截图内容分析 1. 为什么需要截图内容分析能力 去年我在整理技术文档时&#xff0c;经常遇到这样的场景&#xff1a;某个软件界面的配置项需要记录下来&#xff0c;但手动抄写既费时又容易出错。当时我尝试过各种OCR工具&…...

SiameseUIE中文-base教程:DEPLOYMENT.md文档解读与自定义扩展路径

SiameseUIE中文-base教程&#xff1a;DEPLOYMENT.md文档解读与自定义扩展路径 你是不是也遇到过这样的烦恼&#xff1f;面对一篇新闻稿&#xff0c;想快速找出里面的人名、地名和公司名&#xff0c;手动标注得眼花缭乱&#xff1b;或者分析一堆用户评论&#xff0c;想搞清楚大…...

I.MX6ULL GPIO配置避坑指南:HYS、PUS、DSE这些寄存器位到底怎么设?

I.MX6ULL GPIO配置实战手册&#xff1a;寄存器位场景化解析与避坑策略 如果你正在使用I.MX6ULL开发嵌入式系统&#xff0c;GPIO配置可能是你遇到的第一个"拦路虎"。与常见的STM32不同&#xff0c;I.MX6ULL的GPIO配置寄存器充满了各种缩写——HYS、PUS、PUE、PKE、ODE…...

OpenClaw成本优化:Qwen3.5-9B-AWQ-4bit量化模型长期运行实测

OpenClaw成本优化&#xff1a;Qwen3.5-9B-AWQ-4bit量化模型长期运行实测 1. 为什么关注量化模型与OpenClaw的适配性 第一次用OpenClaw执行图片处理任务时&#xff0c;我的MacBook Pro风扇狂转的噪音让我意识到问题的严重性——原版Qwen3.5-9B模型在连续处理20张产品截图后&am…...

微信小程序私域直播的五大替代方案及成本效益分析

1. 微信小程序私域直播现状与挑战 去年6月腾讯突然关闭小程序直播功能申请的消息&#xff0c;让很多依赖微信生态的商家措手不及。我接触过不少做服装、美妆的客户&#xff0c;他们之前靠着小程序直播能轻松做到单场50万的销售额&#xff0c;功能关闭后业绩直接腰斩。现在商家们…...

OpenClaw+gemma-3-12b-it:多语言文档自动翻译系统

OpenClawgemma-3-12b-it&#xff1a;多语言文档自动翻译系统 1. 为什么需要本地化文档翻译方案 去年参与一个跨国协作项目时&#xff0c;我每天要处理数十份英文技术文档。传统翻译工具要么需要手动复制粘贴&#xff0c;要么存在隐私泄露风险。直到发现OpenClawgemma-3-12b-i…...