java 反射用法_Java 反射的概念与使用

一,反射的概念

对于一个人来说,了解自己的能力、本事、特点,对于他去干事创业来说,是很重要的。

同样的,对于一门面向对象的语言来说,了解类(对象其实就是类的实现)本身也是重要的,可以在很多地方帮助程序更好的进行。

那么类/对象本身包含那些内容呢,无非就是类名称;父类;继承的接口;类的属性;类的方法,这些都属于是类的信息。

好的,那么这些信息程序员都知道啊,类的信息在定义类的时候不是都写的明明白白的吗。但是反射的意义却是:在程序跑起来之后可以使用代码去获取类的信息。这个,没有反射可办不到。

Java是面向对象的,所有的东西都是有类别的。所以哦,类的信息也是一种类型(就像用户信息可以用UserInfo类描述),类的信息对应的Java类为Class类,注意不是关键字class哈。

举个最常见的栗子:

public class ClassDemo {

public static void main(String[] args) {

try {

Class mysqlDriver=Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

这里Class.forName很明显是Class类的一个static方法,这个方法的意思就是按类名(完整的带包路径的类名)返回类对应的Class对象。因为forName的参数是可以随便写的嘛,所以会抛出一个ClassNotFoundException。

Class.forName方法是在程序运行时按类名称获取类的信息的方法,这就是反射机制。

二,如何获取类的Class对象

我们定义一个普通类Student,可以有三种方式获取到Student的类型信息:

package temp;

public class Student {

String studentName;

public String getStudentName(){

return studentName;

}

public static void main(String[] args) throws ClassNotFoundException {

//方式1 利用类名称

Class class1 = Class.forName("temp.Student");

//方式2 利用类

Class class2=Student.class;

//方式3 利用对象

Student student=new Student();

Class class3=student.getClass();

}

}

三,通过类的Class对象获取类的属性和方法

获取到Class(类的类型)之后,再获取属性和方法就简单了,直接使用Class类封装的方法即可。

getDeclaredFields:获取类属性

getDeclaredMethods():获取类方法

使用一个完整的程序演示如下:

package temp;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class Student {

String studentName;

public String getStudentName(){

return studentName;

}

public static void main(String[] args) throws ClassNotFoundException {

Class classStu=Student.class;

Field[] fields = classStu.getDeclaredFields();

for(Field field:fields){

System.out.println("属性类型:"+field.getType().getSimpleName()+",属性名称:"+field.getName());

}

Method[] methods=classStu.getDeclaredMethods();

for(Method method:methods){

System.out.println("方法名称:"+method.getName()+",返回类型"+method.getReturnType());

}

}

}

执行结果如下:

属性类型:String,属性名称:studentName

方法名称:main,返回类型void

方法名称:getStudentName,返回类型class java.lang.String

可见,通过Class类封装的方法,可以在程序运行时候直接获取类的信息。

四,反射的意义

凡是都有正反两个方面,先说不好的消息吧,用了反射,性能肯定是会降低的。注意此处的性能低,并不是说通过反射获取类的信息性能低,因为除了反射也没有啥可以获取类的信息的机制了。

性能低是指通过反射调用方法性能低,看下面的例子,通过反射获取到方法之后,可以将该方法应用到一个对象上实现该对象的方法调用。本来可以直接调用,反射之后再调用肯定效率要低的。

Class classStu=Student.class;

Student student=new Student();

Method methodGet=classStu.getDeclaredMethod("getStudentName");

//可以通过Method类的invoke方法调用类方法,当然必须得提供对象

String name=(String)methodGet.invoke(student);

System.out.println(name);

但是反射的正面意义还是光辉的,首先提供了一种了解类的信息的手段,使程序运行编写、运行更加自由灵活,充满了更多可能性。

简单的想,在将对象转换为json时,键值对的键不就是对象的属性名称么,用反射获取对象的属性名称是多么爽快的事情啊。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Unity中的Mesh Collider碰撞器

原来我的场景中有一个平面Plane带Mesh Collider碰撞器组件,一个主角Hero带有一个Box Collider碰撞器和有重力的Rigidbody刚体组件,主角可以放在平面上。 在导入场景后,隐藏平面Plane,给一个地板添加一个Mesh Collider碰撞器&#…

GCC常用选项使用详解

通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编译程序,它是Linux平台编译…

java 井字棋 人机_井字游戏 人机对战 java实现

package com.ecnu.Main;/*** 主函数触发游戏*/public class MainApplication {public static void main(String[] args){TicTacToeGame ticTacToeGame new TicTacToeGame();ticTacToeGame.start();}}//TicTacToeGame 方法类import java.util.Scanner;public class TicTacToeGa…

Session(数据)共享的前后端分离Shiro实战

1,前言本文期望描述如何使用Shiro构建基本的安全登录和权限验证。本文实战场景有如下特殊需求:1,在集群和分布式环境实现session共享;2,前端只使用HTML/CSS/JS。因此无法直接使用Shiro提供的SessionManager&#xff0c…

读书笔记(javascript 高级程序设计)

一. 数据类型: 1. undefined: 未声明和未初始化的变量,typeof 操作符返回的结果都是 undefined;(建议未初始化的变量进行显式赋值,这样当 typeof 返回 undefined 时就知道是未声明了,帮助定位问…

关于gcc扩展中的宏定义中用 # 和 ##

关于gcc扩展中的宏定义中用 "#" 和 "##"今天测试了宏定义中的 "#" 和 "##" 的区别。 结果如下: "#" 代表和一个字符串相连接 "##" 代表和一个符号连接,符号可以是变量,或另一…

java 年计算_java实现计算某年某月的天数

在计算某年某月的天数时,需要注意平年闰年。分析:闰年具体的判定方法就要看它的判定条件:四年一闰 , 百年不闰 ,400年再闰。而计算该年该月的天数,又分大月和小月,特殊月份2月之分。(视频教程推…

添加自定义菜单,报错40155

2019独角兽企业重金招聘Python工程师标准>>> 提交的json中,某个自定义菜单对应的URL访问是有问题的,请挨个检查一下。 转载于:https://my.oschina.net/selly1025/blog/1551496

gcc编译流程及中间表示层RTL的探索

gcc编译流程及中间表示层RTL的探索收藏新一篇: 解读VC编程中的文件操作API和CFile类 | 旧一篇: Effective Item21 尽可能使用const 内容摘要 本文将以 C 语言为例,介绍 gcc 在接受一个 .c文件的输入之后,其前端是如何进行处理并得到一个中间表示并转交给…

【bzoj2132】圈地计划 网络流最小割

题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地。据了解,这块土地是一块矩形的区域,可以纵横划分为NM块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根据不同的地形环境,每…

python爬虫爬取数据如何将br去掉_Python怎么去除爬取下来的网站中的一些转义字符串 - 收获啦...

基本方法其实用python爬取网页很简单,只有简单的几句话这样就可以获得到页面的内容。接下来再用正则匹配去匹配所需要的内容就行了。但是,真正要做起来,就会有各种各样的细节问题。2.登录这是一个需要登录认证的网站。也不太难,只…

Linux基础

Linux的特点: 系统版本:常见的有debian、Redhat更适合做服务器,更安全和稳定,Ubuntu唯一的优势就是图形界面好,centos目前被redhat收购,红旗已经倒闭。 1、免费的/开源的;2、支持多线程/多用户&…

GCC的编译和调试--入门介绍

编译与调试1.1编译的概念和理解在进行C程序开发时,编译就是将编写的C语言代码变成可执行程序的过程,这一过程是由编译器来完成的。编译器就是完成程序编译工作的软件,在进行程序编译时完成了一系列复杂的过程。1.1.1程序编译的过程在执行这一…

A* a=new B ,会不会产生内存泄露了,露了B-A的部分?

A* anew B ,delete a;会不会产生内存泄露了,露了B-A的部分。其中B为A的子类 析构函数在下边3种情况时被调用:1.对象生命周期结束,被销毁时;2.delete指向对象的指针时,或delete指向对象的基类类型指针,而其基…

spring 第一天:1015

对象加强的三种方法:1/继承2/装饰着模式3/动态调用 2:装饰着模式:就是就是1-先建一个基类 ,如咖啡类 。味道很苦2- 再建一个类配料类 也就是说是所欲配料种类的父类。然后写多配料子类个子类继承配料类,。3-子类三个步…

java public 继承_java继承问题

代码:父类:public class Father {public Father() {System.out.println("基类构造函数{");show();new a();System.out.println("}");}public void show() {System.out.println("基类----show");}public class a {public a…

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数(数位DP+恶心细节)

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec Memory Limit: 64 MBDescription 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺序。她们甚至也不能通过仍硬币的方式。 所以她们通过"round number&q…

Optimizing Code with GCC

现在的编译器越来越聪明,功能越来越强,从简单的函数内联,到复杂的寄存器分析,一系列代码革命使程序运行得越来越快。大多数时候,更快比更小重要,因为磁盘空间和内存都变得便宜了。但是在嵌入式系统里&#…

QTP的那些事--操作excel的函数

1: QTP Excel函数 操作EXCEL 数据表格 表单 编辑EXCEL 工作表 2: Dim ExcelApp As Excel.Application 3: Dim excelSheet As Excel.worksheet 4: Dim excelBook As Excel.workbook 5: Dim fso As scrīpting.FileSystemObject 6: 7: ******************…

java-生产者消费者模式

经常会有公司叫我们手撕代码,比如网易,阿里,那我们是不是该掌握下呢。下面这段代码来自《现代操作系统》进程与线程P49页。 public class ProducerConsumer {public ProducerConsumer() { }private static final int N 100;static Producer …