`

Java反射初探

阅读更多
    目前非常多的开源框架的工作核心和底层实现原理都是基于反射来工作的。我这边也是闲来无事,公司那边等着走流程签合同,就自己看着JDK的API文档,并结合以前用过的一点知识,做了下反射的简单事例。
    首先反射的具体功能是发现类的方法、属性、构造器(包含私有属性、方法和构造器)。网上众多的所谓动态代理的实现大多也是通过反射来实现的。
    涉及Java包主要为java.lang.Class,java.lang.reflect,我的JDK版本是1.6的。
    由于时间有限,我这次也是浅尝,下次在进一步研究和更新。

    这里只有两个类:为了好看,我将测试方法和发现的机制放到了同一个类(ReflectDemo )中如下:
package com.xiaoyun.reflect;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
* 反射机制学习
*
* @author XiaoYun 2013-07-10
*/
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Person person = new Person(1,1,1.0,"中国人", false);
reflect(person);
}

/**
* 反射功能
* 用于发现 obj的类型
* obj的方法
* obj的属性
* obj的构造器
* @param obj 用户被发现的对象
*/
public static void reflect(Object obj) {
Class cls = obj.getClass();

//发现该类的类型
String clsName = cls.getSimpleName();
System.out.println("类名:" + clsName);
//发现该类的属性
//返回该对象所表示的类或接口中声明的所有字段
Field[] allFields = cls.getDeclaredFields();
//返回该对象表示的类或接口中声明的公共字段
//Field[] unPrivateFields = cls.getFields();
StringBuilder fields = new StringBuilder(150);
fields.append("声明的属性:");
//组装打印到控制台的字段
for (Field field : allFields) {
Annotation[] annotations = field.getAnnotations();
fields.append(field.getName()).append(",").append(field.getType().getName()).append(",").
append(annotations.length).append("\n");
}
System.out.println(fields.toString());
//发现该类的方法(包含私有方法)
Method[] methods = cls.getDeclaredMethods();
//组装打印到控制台的方法描述
StringBuilder methodsStr = new StringBuilder(100);
methodsStr.append("方法的声明:");
for (Method method : methods) {
methodsStr.append(method.getName()).append(",");
//形参类型
Class[] clazz = method.getParameterTypes();
for (Class c : clazz) {
System.out.println(c.getSimpleName());
}
}
methodsStr.deleteCharAt(methodsStr.lastIndexOf(","));
System.out.println(methodsStr.toString());
//发现该类的构造器
//返回该对象表示的类的所有公共的构造方法
Constructor[] unPrivateConstructors = cls.getConstructors();
//发现该对象表示的类所声明的所有的构造方法
Constructor[] allConstructors = cls.getDeclaredConstructors();
//组装打印到控制台的构造器描述
StringBuilder constructors = new StringBuilder(150);
constructors.append("构造器:");
for (Constructor constructor : allConstructors) {
constructors.append(constructor.getName()).append(",");
Class[] types = constructor.getParameterTypes();
for (Class class1 : types) {
constructors.append(class1.getName()).append("\n");
}
}
constructors.deleteCharAt(constructors.lastIndexOf(","));
System.out.println(constructors.toString());
}
}
测试你也可以使用Class.forName("java.lang.String")等来获取对象的方法和属性,我这里是使用的自己又创建了一个Pojo类(Person):
package com.xiaoyun.reflect;


/**
* 人实体类
*
* @author XiaoYun 2013-07-10
*/
public class Person {

private static Person instance = new Person();

/** 年龄 */
private Integer age;
/**  身高*/
private Integer height;
/** 体重 */
private double weight;
/** 描述 */
private String desc;
/** 婚否 */
private boolean isMarry;

private Person() {
}

public Person(int age, int height, double weight, String desc,
boolean isMarry) {
super();
this.age = age;
this.height = height;
this.weight = weight;
this.desc = desc;
this.isMarry = isMarry;
}

public static Person getInstance() {
return instance;
}
        
         //说明,这里是为了测试反射机制能发现私有方法而对get方法做的修改
private Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public Integer getHeight() {
return height;
}

         //说明,这里是为了测试反射机制能发现私有方法而对get方法做的修改
private void setHeight(Integer height) {
this.height = height;
}

public double getWeight() {
return weight;
}

public void setWeight(double weight) {
this.weight = weight;
}

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}

public boolean isMarry() {
return isMarry;
}

public void setMarry(boolean isMarry) {
this.isMarry = isMarry;
}
}

代码在我的电脑上运行过,完全正常,代码可以直接粘贴,只不过打印出来的属性的类别,Integer打印出来的是int,boolean是boolean,String是java.lang.String,是正常的,我认为可能是JDK编译的时候还是把Integer类型当做简单类型来编译的,所以打印出来的没有在lang包中。

你也可以在获取该实例的属性、方法后,调用该方法。

关于动态代理的具体实现,下次在发布。这次的重点是掌握反射机制的原理。即java.lang.Class包和java.lang.reflect.Field,java.lang.reflect.Method,java.lang.reflect.Construct的使用。
下次将对JDK或CGLIB对动态代理的实现原理做演示和讲解。

初次发布自己写的东西,不合适和不完整的地方欢迎各位同行和前辈们批评指正。谢谢
下次
分享到:
评论

相关推荐

    Fluent电弧,激光,熔滴一体模拟 UDF包括高斯旋转体热源、双椭球热源(未使用)、VOF梯度计算、反冲压力、磁场力、表面张力,以及熔滴过渡所需的熔滴速度场、熔滴温度场和熔滴VOF

    Fluent电弧,激光,熔滴一体模拟。 UDF包括高斯旋转体热源、双椭球热源(未使用)、VOF梯度计算、反冲压力、磁场力、表面张力,以及熔滴过渡所需的熔滴速度场、熔滴温度场和熔滴VOF。

    基于协同过滤算法商品推荐系统.zip

    基于协同过滤算法商品推荐系统.zip

    锂电池半自动带电液舱标准手套箱(sw16可编辑+工程图)全套技术资料100%好用.zip

    锂电池半自动带电液舱标准手套箱(sw16可编辑+工程图)全套技术资料100%好用.zip

    jquery实现的网页版扫雷小游戏源码.zip

    这是一款基于jQuery实现的经典扫雷小游戏源码,玩家根据游戏规则进行游戏,末尾再在确定的地雷位置单击右键安插上小红旗即可赢得游戏!是一款非常经典的jQuery游戏代码。本源码改进了获胜之后的读数暂停功能。另外建议用户使用支持HTML5与css3效果较好的火狐或谷歌等浏览器预览本源码,可以看到地图的远景拉伸效果。

    Android studio 健康管理系统期末大作业App源码

    Android studio 健康管理系统期末大作业App源码

    校园表白墙网站源码、表白墙网站制作、网页表白墙源码

    校园表白墙网站源码、表白墙网站制作、网页表白墙源码 效果演示https://www.hybiaobai.cn/ 校园表白墙网站源码、表白墙网站制作、网页表白墙源码

    文字生成视频-可灵1.6

    In the video, a person stands alone in a snowy night, holding a delicate wine cup, with a desolate expression. The snowflakes are falling gently, and the person seems lost in deep thoughts and memories. They take a few steps, as if trying to follow the wind, with a sense of yearning and melancholy. The background shows an ancient Chinese-style house with eaves covered in snow, adding to the lonely and nostalgic atmosphere. The person's movements are slow and graceful, reflecting the complex emot

    ①软件 程序 网站开发路面附着系数估计,采用UKF和EKF两种算法 软件为Matlab Simulink,非Carsim联合仿真 dugoff轮胎模块:纯simulink搭非代码 整车模块:7自由

    ①软件 程序 网站开发路面附着系数估计,采用UKF和EKF两种算法。 软件为Matlab Simulink,非Carsim联合仿真。 dugoff轮胎模块:纯simulink搭非代码 整车模块:7自由度整车模型 估计模块:无迹卡尔曼滤波,扩展卡尔曼滤波,均是simulink现成模块应用无需S-function 带有相关文献和估计说明

    基于Spring Boot的在线考试系统--论文.zip

    基于Spring Boot的在线考试系统--论文.zip

    基于多边形逼近与仿射不变量的部分遮挡物体识别算法

    内容概要:本文介绍了一种新方法,用于识别仅由轮廓表示的部分遮挡物体。该方法通过对拐点检测来创建对象的近似多边形形状描述符,并采用一种简单易实施的匹配算法。描述符能够对噪声和部分遮挡保持较好的鲁棒性,在计算机视觉应用中尤其有效。研究涉及多种测试,涵盖人工数据、现实世界图像及不同条件下的变化(如加性高斯噪声、部分遮挡等),展示了良好的效果以及相较于同类方法的优势。 适用人群:从事计算机视觉相关工作的科研人员及技术人员。 使用场景及目标:适用于需要自动化的部分遮挡目标检测和匹配的各种应用场景,尤其是在机器学习项目中涉及光学字符识别等领域。通过使用该算法可以提高复杂环境中物体匹配的成功率,增强系统鲁棒性和适应范围。 其他说明:作者还讨论了关于边界表示法的一些优缺点并提出未来改进方向,例如自动生成迭代次数及引入新的层级化匹配策略。此外,文中提到的所有实验均在标准条件下进行,但当应用于实际环境中时可能需要额外调整参数以达到最佳性能。

    【Python】基于Python的美篇高清图片爬虫.zip

    【Python】基于Python的美篇高清图片爬虫

    node-v14.17.5-x64 msi安装包

    node-v14.17.5-x64 msi安装包

    ie8 升级到ie11 离线安装包

    ie8 升级到ie11 离线安装包 先安装补丁,再安装ie,某个补丁安装不上就跳过,先安装其他补丁,再回来安装。最后能装IE11就可以了

    设计与实现基于JavaWeb的校园兼职信息平台-毕业设计课程设计.zip

    Title: 《设计与实现基于JavaWeb的校园兼职信息平台——毕业设计/课程设计》 项目概述 本项目是一款针对校园环境的兼职信息平台,旨在为学生提供寻找兼职工作的机会,同时为企业提供一个发布兼职信息的平台。该平台采用JavaWeb技术,结合SSM(Spring, SpringMVC, MyBatis)框架开发,专注于解决学生兼职信息不对称的问题。 功能模块 兼职信息发布:企业用户可以发布兼职信息,包括职位描述、要求、薪资等。 兼职信息浏览:学生用户可以浏览兼职信息,并根据条件筛选合适的兼职。 评论与反馈:用户可以对兼职信息和雇主进行评论和反馈。 用户管理:包括学生和企业用户的注册、登录、信息修改等。 消息通知:系统会向用户推送相关的兼职信息和评论通知。 项目特色 评论功能(Comment Part-time):学生可以对企业发布的兼职进行评价,帮助其他学生更好地选择兼职。 信息审核:确保兼职信息的真实性和有效性。 用户互动:提供私信功能,方便学生与企业之间的沟通。 项目目标 帮助学生更快地找到合适的兼职工作。 为企业提供高效的人才招聘渠道。 增强校园内的就业服务和信息交流。 开发流

    基于springboot的应急救援物资管理系统.zip

    基于springboot的应急救援物资管理系统.zip

    用Python开发 Telegram 接口:涵盖用户登录、好友列表及聊天功能-含可运行代码及解释说明

    内容概要:本文档详细讲解了利用 Python 和 python-telegram-bot 库创建一个简易但实用性强的 Telegram 接口的方法。主要内容涵盖了从配置所需环境(如安装相关库)、编写登录验证逻辑,到实现获取好友列表和实施即时通信(聊天)等功能的具体代码演示及解释。文中还提供了关于用户认证的基本方法、简单用户数据模拟、基本的日志记录方式,以及启动机器人并维持监听状态的操作指导,最后提醒开发者替换成自己的 bot token 并指出了一些安全方面的考量,比如严格验证用户输入以保障应用程序的安全性。 适合人群:对于有兴趣探索社交平台集成或是初次接触即时通讯软件自动化构建,尤其是想基于 Python 来快速搭建一个 Telegram Bot 的初学者或是拥有基础编程经验的人士来说非常适合。 使用场景及目标:适用于想要快速建立个人或者小团队之间的信息交流渠道,测试和熟悉 Telegram Bot API 的工作机制,以及进一步理解和提升在社交平台上自动化工具开发技能的情况。这有助于加深理解 API 调用流程、异步消息传输机制等相关知识点,同时也可以作为更大规模项目的基础模块之一来考虑扩展。 其他说明:本指南侧重于理论联系实际的应用层面教学,不仅提供了完整的代码案例让读者可以亲手操作,还强调了良好编码习惯的重要性(像添加适当的注释),并且提及到了未来可能遇到的技术挑战——例如用户数据的真实保存与维护(推荐采用数据库解决方案)。这对于提高读者的实际动手能力和激发更多自主思考都起到了积极作用。

    手搓人工神经网络的教程

    手搓人工神经网络的教程。在CSDN文章中也有,但CSDN文章排版略有偏差,因此附上pdf文档

    回旋提升式柔性链输送机sw16可编辑全套技术资料100%好用.zip

    回旋提升式柔性链输送机sw16可编辑全套技术资料100%好用.zip

    视觉点胶+伺服打螺丝+压装+电测试生产线x_t全套技术资料100%好用.zip

    视觉点胶+伺服打螺丝+压装+电测试生产线x_t全套技术资料100%好用.zip

    基于java的准妈妈孕期交流平台设计新版源码+数据库+说明

    调试过可以运行。 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9

Global site tag (gtag.js) - Google Analytics