Java反射机制实例解析
1、获取想操作的访问类的java.lang.Class类的对象
2、调用Class对象的方法返回访问类的方法和属性信息
3、使用反射API来操作
每个类被加载后,系统会为该类生成一个对应的Class对象,通过该Class对象就可以访问到Java虚拟机中的这个类,Java程序中获取Class对象通常有如下三种方式:
1、调用某个对象的getClass()方法,是Object中的一个方法,所以所有类都可以调用这个方法
Person p= new Person();
Class cla = p.getClass();
2、调用某个类的class属性来获取该类对应的Class对象
Class cla = Person.class;
不过这种方法是要在编译阶段都要知道类的名称
3、使用Class类的forName()静态方法
该方法需要传入字符串参数,该字符串参数的值是某个类的全名,例如
//用户输入类的全路径
//JOptionPane 有助于方便地弹出要求用户提供值或向其发出通知的标准对话框
String classpath = JOptionPane.showInputDialog(null, "输入类的全路径"); //根据类的全路径进行类加载,运回该类的Class对象
Class class1= Class.forName(classpath);
上面一定要填完整的包名,否则会抛出一个ClassNotFoundException异常
总结:2、3都是调用某个class方法来获取该类对应的Class对象,
代码更安全,程序在编译阶段,就要检查所访问的Class对象是否存在
程序性能更高,因为这2种方式无须调用方法,所以程序的性能更好,大部分我们都应该使用调用getClass()来获取该类的Class对象
实例:
Person.java
package com.pb.reflect.classinfo;
public class Person {
private String name;
private String gender;
private int age;
public String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
private String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return "姓名是:"+name+",年龄是:"+age;
}
}
ReflectAction.java
package com.pb.reflect.classinfo; import java.lang.reflect.Field;
import java.lang.reflect.Method; import javax.swing.JOptionPane; //通过用户输入类的全路径,获取该类的成员方法和成员属性
public class ReflectAction {
/* 获取Class对象方式一
* 构造方法,通过class.forName()方法获取Class对象
*/
public ReflectAction(){
//用户输入类的全路径
//JOptionPane 有助于方便地弹出要求用户提供值或向其发出通知的标准对话框
String classpath = JOptionPane.showInputDialog(null, "输入类的全路径");
try {
//根据类的全路径进行类加载,运回该类的Class对象
Class class1= Class.forName(classpath);
//通过Class对象的class1的自审,返回方法对象集合
Method[] methods = class1.getMethods();
//便利methods数组,并输出方法信息
System.out.println("#######获取方法信息##########");
for(Method meth:methods){
System.out.println(meth.toString());
}
System.out.println("#######获取方法信息结束##########");
//利用Class对象class1的自审,返回成员属性对象集合 Field[] fields = class1.getDeclaredFields();
//便利fields数组,并输出属性信息
System.out.println("#######获取属性信息##########");
for(Field field:fields){
System.out.println(field.toString());
}
System.out.println("#######获取属性信息结束##########");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 获取Class对象方式二:使用对象的getClass()方法
*/
public ReflectAction(Person p){
Class class1 = p.getClass();
//通过Class对象的class1的自审,返回方法对象集合
Method[] methods = class1.getMethods();
//便利methods数组,并输出方法信息
System.out.println("#######获取方法信息##########");
for(Method meth:methods){
System.out.println(meth.toString());
}
System.out.println("#######获取方法信息结束##########");
//利用Class对象class1的自审,返回成员属性对象集合 Field[] fields = class1.getDeclaredFields();
//便利fields数组,并输出属性信息
System.out.println("#######获取属性信息##########");
for(Field field:fields){
System.out.println(field.toString());
}
System.out.println("#######获取属性信息结束##########");
} }
TestReflection.java
package com.pb.reflect.classinfo; import java.lang.reflect.Field;
import java.lang.reflect.Method; public class TestReflection {
public static void main(String[] args) {
/*第一种方式运行代码:
*
ReflectAction rf = new ReflectAction();*/ /*第二种方式运行代码:
* Person p=new Person();
ReflectAction rf = new ReflectAction(p);*/ /*
* 获取Class对象方式三,通过类的class属性获取
*
*/
Class class1 = Person.class;
//通过Class对象的class1的自审,返回方法对象集合
Method[] methods = class1.getMethods();
//便利methods数组,并输出方法信息
System.out.println("#######获取方法信息##########");
for(Method meth:methods){
System.out.println(meth.toString());
}
System.out.println("#######获取方法信息结束##########");
//利用Class对象class1的自审,返回成员属性对象集合 Field[] fields = class1.getDeclaredFields();
//便利fields数组,并输出属性信息
System.out.println("#######获取属性信息##########");
for(Field field:fields){
System.out.println(field.toString());
}
System.out.println("#######获取属性信息结束##########");
}
}
推荐使用第3种方法
Java反射机制实例解析的更多相关文章
- Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html
Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html
- Java反射机制(Reflect)解析
一.导读 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计 ...
- java反射机制实例
1.通过数据库字段反射给对象实例赋值 convertClass.java /** * 通过反射构造对象 * @param obj * @param rs * @return */ public Obj ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
- [转]Java反射机制详解
目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...
- 【转载】Java反射机制详解
转自:http://baike.xsoftlab.net/view/209.html#3_8 1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对 ...
- Java知识总结:Java反射机制(用实例理解)
概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能 ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
- java反射机制简单实例
目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...
随机推荐
- web 前端常用组件【04】Datetimepicker 和 Lodop
web项目中日期选择器和打印这两个功能是非常常见,将使用过的日期和打印控件,在这里总结归纳,为方便后面使用. 1.Datetimepicker a.官方API:http://www.bootcss.c ...
- (转)RSA算法原理(二)
作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解 ...
- unity3d 三分钟实现简单的赛车漂移
提到赛车游戏,大家最关心的应该就是漂移吧?! 从学unity开始,我就一直在断断续续的研究赛车 因为自己技术太烂.悟性太差等原因,我走了不少弯路 也许你会说,网上那么多资料,你不会查啊 是啊!网上一搜 ...
- hystrix-turbine 监控的使用
1. 概述 Demo地址:http://git.oschina.net/zhou666/spring-cloud-7simple/tree/master/cloud-hystrix-turbine ...
- 用matlab实现同一个序列重复N倍
同一个序列 重复N倍 怎么用matlab实现 可以使用repmat函数 repmat(A, 1, 3) 其中A即为复制的矩阵,1为纵向复制的次数,3即为横向复制的次数.
- JavaScript学习笔记-商品管理新增/删除/修改功能
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- redis在window环境下的安装
1.下载客户端文件 地址:https://github.com/dmajkic/redis/downloads 客户端文件目录说明: 2.启动redis服务端 1.在客户端文件目录下新建一个bat文件 ...
- git查看提交历史
git日志的查看 在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看. 查看日志信息: $ git log 可以用 --oneline ...
- Java--剑指offer(10)
46.每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一 ...
- 如何在Ubuntu上配置scala教程
Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言 .并集成面向对象和函数式变成的各种特性.这里为了学习spark特地配置了scala. 1.下载scala安装包 ...