Java学习日记之反射


如果不知道某个是对象的确切类型,RTTI(通过运行时类型信息)可以告诉我们。但是有限制:这个类型在编译的时候自己要知道。这样我们才能使用RTTI、换句话说:在编译的时候编译器必须知道所有要通过RTTI处理的类。

我们在更大的变成世界中的时候,首先就是“基于构件的编程”,在此种编程中,将使某种基于快速开发应用的构建工具来构建项目。这是一种高可视化编程方法,可通过不同组件的突变拖拽到表单中来创建程序。然后再变成的时候通过设置构件的蜀绣那个来配置他们。这种设计时的配置,要求构件都是可实例化的,并且要暴露部分信息,以允许程序员来读取和设置构件的值。

人们想要在运行的时候来获取类的信息的一个重要方法就是反射机制。

Java反射机制就是在运行状态中,对于任意的一个类,能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用他的任意一个方法和属性,这种动态的获取信息以及动态的调用对象的方法的功能就是Java语言的反射机制。

Java反射机制:程序运行时,允许改变成粗结构或者变量类型,即动态语言。

Java反射机制提供 的主要功能有下:

1.在运行的时候判断任意对象所属类;

2.在运行的时候构造任意一个类的对象;

3.运行的时候判断一个类所具有的成员变量和方法;

4.运行的时候调用任意一个对象的方法;

5.生成动态代理。

1:  得到各个字节码对应的实例对象:
·类名.class 或者 类名.TYPE
·对象.getClass()
·Class.forName("类名")

示例1:

public class Test01{
	/**
	 * 反射机制
	 * @param args
	 * @throws ClassNotFoundException 
	 */
	public static void main(String [] args) throws ClassNotFoundException{
		// TODO Auto-generated catch block
		String str1 = "abc";    
        
		Class cls1 = str1.getClass();  //三种获取字节码的方法   
		Class cls2 = String.class;    
		Class cls3 = Class.forName("java.lang.String");
				    
		System.out.println(cls1 == cls2);    
		System.out.println(cls2 == cls3); 
	}
}
2.通过Field调用成员变量

示例2:

public class Test02{
	/**
	 * 反射机制
	 * @param args
	 */
	public static void main(String [] args){
		// TODO Auto-generated catch block
		ReflectPoint MyRe = new ReflectPoint(3, 6);    
        Field Myfield = MyRe.getClass().getField( "y");    
        System. out.println(Myfield.get(MyRe)); 
	}
}
class ReflectPoint {    
    private int x;    
    public int y ;    
        
    public ReflectPoint(int x, int y) 
    {    
          super();    
          this.x = x;    
          this.y = y;    
   }    
}
3.数组的反射机制

示例3:使用Array工具类完成

public class Test03{
	/**
	 * 数组反射
	 * @param args
	 */
	public static void main(String [] args){
		// TODO Auto-generated catch block
		 String[] str = new String[]{"a" ,"b" ,"c" };    
         String str1 = "xyz";    
            
         printObject(str);    
         printObject(str1);    
    }    
       
    public static void printObject(Object ob)
    {    
      Class MyClass = ob.getClass();    
      if(MyClass.isArray())
      {    
            int len = Array.getLength(ob);    
            for(int i = 0; i < len; i++)
            {    
                  System. out.println(Array.get(ob, i));    
            }    
      } 
      else
      {    
    	  System. out.println(ob);    
      }    
    }    
}

小结:

Class类中存在以下几个重要的方法:

 1.getName()

一个Class对象描述了一个特定类的特定属性,这个方法就是用来返回String形式的类的简要描述

2.newInstance()

这个方法可以根据某个Class对象来产生其对应类的实例。

注意:它调用的是此类的默认构造方法。

例如:

MyObject my1 = new MyObject();

MyObject my2 = my1.getClass().newInstance();

3.getClassLoader()

返回Class对象对应的类加载器。

 4.getComponentType()

该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。

例如:

int[] array = new int[]{1,2,3};

Class class1 = array.getClass();

Class class2 = class1.getComponentType();

这里得到的class2对象所对应的就是int这个基本类型的Class对象。

 5.getSuperClass()

返回子类所对应父类所对应的Class对象。

 6.isArray()

判定此Class对象所对应的是否是一个数组对象。

示例1:

//得到某个对象的公共属性
public Object getProperty(Object owner, String fieldName) throws Exception 
{
	Class ownerClass = owner.getClass();   		  
	Field field = ownerClass.getField(fieldName);   		  
	Object property = field.get(owner);   		  
	return property;   
}
示例2:得到某类的静态的公共方法

public Object getStaticProperty(String className, String fieldName) 
{ 
	Class ownerClass = Class.forName(className);   
	Field field = ownerClass.getField(fieldName);   
	Object property = field.get(ownerClass);   
	return property; 
}
示例3:得到数组中的某个元素

public Object getByArray(Object array, int index)
{
	return Array.get(array,index);   
}
源码来自:https://pan.quark.cn/s/a4b39357ea24 《C++ Primer》作为C++编程领域中的一部权威著作,主要服务于初学者和经验丰富的开发者,致力于帮助他们深入掌握C++的核心知识。 第一章通常会详细讲解C++语言的基础概念和语法结构,包括变量的使用、数据类型的分类、常量的定义、运算符的应用以及基础的输入输出操作。 接下来,我们将对这一章中的核心知识点和可能的习题解答进行深入分析。 ### 1. 变量与数据类型在C++编程中,变量被视为存储数据的媒介。 每一个变量都必须预先声明其数据类型,常见的数据类型有整型(int)、浮点型(float)、双精度浮点型(double)以及字符型(char)。 例如:```cppint age = 25; // 声明一个整型变量age并赋予其初始值25float weight = 70.5f; // 声明一个浮点型变量weight并赋予其初始值70.5char grade = A; // 声明一个字符型变量grade并赋予其初始值A```### 2. 常量与字面量常量指的是不可更改的值,可以通过`const`关键字进行声明。 例如:```cppconst int MAX_SIZE = 100; // 声明一个整型常量MAX_SIZE,其值为100```字面量是指程序中直接书写的值,如`42`、`3.14`或`"Hello"`。 ### 3. 运算符C++提供了多种运算符,涵盖了算术运算符(+,-,*,/,%)、比较运算符(==,!=,<,>,<=,>=)、逻辑运算符(&&,||,!)以及赋值运算符(=,+=,-=,*=,/=,%=)等。 ### 4. 输入与输出在C++中,使用`std::cin`来实现输...
内容概要:本文详细介绍了一个基于C++的仓库存储管理系统的设计与实现,涵盖了项目背景、目标、挑战及解决方案,并系统阐述了整体架构设计、数据库建模、功能模块划分、权限安全、并发控制、数据一致性保障、异常处理与可扩展性等关键内容。通过面向对象编程思想,采用分层架构与模块化解耦设计,结合STL容器、多线程、锁机制等C++核心技术,实现了高效的库存管理功能,包括入库、出库、盘点、调拨、权限控制、日志追踪与智能报表分析。文中还提供了核心类如Inventory(库存)、User(用户权限)、LogEntry(操作日志)及WarehouseManager(主控制器)的代码示例,展示了数据结构设计与关键算法逻辑。; 适合人群:具备C++编程基础,熟悉面向对象设计与基本数据结构的软件开发人员,尤其适合从事企业级管理系统开发或希望深入理解系统架构设计的中级开发者(工作1-3年);也适用于计算机相关专业学生进行课程设计或毕业项目参考; 使用场景及目标:①学习如何使用C++构建复杂业务系统的整体架构与模块划分方法;②掌握高并发、数据一致性、权限控制、异常处理等企业级系统关键技术的实现思路;③理解仓储管理业务流程及其在软件系统中的建模与落地方式;④为开发类似ERP、MES等后台管理系统提供技术原型与设计参考; 阅读建议:此资源不仅提供理论架构与代码片段,更强调系统设计的完整性与工程实践性。建议读者结合代码示例动手实现核心模块,深入理解类之间的关系与交互逻辑,重点关注多线程安全、事务管理与权限校验等难点环节,并尝试扩展功能如对接GUI界面或数据库持久化模块,以全面提升系统开发能力。
农作物叶子健康与疾病实例分割数据集 一、基础信息 数据集名称:农作物叶子健康与疾病实例分割数据集 图片数量: - 训练集:7,446张图片 - 验证集:970张图片 - 测试集:182张图片 - 总计:8,598张图片 分类类别: - Apple Healthy(健康苹果叶) - Apple Rust Leaf(苹果锈病叶) - Apple Scab Leaf(苹果黑星病叶) - BellPepper Healthy(健康甜椒叶) - BellPepper Leaf Spot(甜椒叶斑病) - Corn Gray Leaf Spot(玉米灰斑病) - Corn Leaf Blight(玉米叶枯病) - Corn Rust Leaf(玉米锈病叶) - Grape Black Rot(葡萄黑腐病) - Grape Healthy(健康葡萄叶) - Squash Powdery Leaf(南瓜白粉病叶) - Tomato Bacterial Spot(番茄细菌性斑点病) - Tomato Healthy(健康番茄叶) - Tomato Septoria(番茄斑枯病) 标注格式:YOLO格式,包含实例分割的多边形标注,适用于实例分割任务。 数据格式:图片来源于农业图像数据库,细节清晰。 二、适用场景 农业植物疾病AI检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别植物叶子疾病区域并分类的AI模型,辅助农民快速诊断和治理。 精准农业应用研发:集成至农业智能管理系统中,提供实时疾病识别功能,为农作物健康管理提供决策支持。 学术研究与创新:支持农业科学与人工智能交叉领域的研究,助力发表高水平农业AI论文。 农业教育与培训:数据集可用于农业院校或培训机构,作为学生学习植物疾病分类和诊断的重要资源。 三、数据集优势 精准标注与多样性:每张图片均经过准确标注,确保疾病区域分割精确。包
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值