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反射机制:解析原理与应用
深入探索Java反射机制:解析原理与应用
- [转]Java反射机制详解
目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...
- java invoke 泛型_利用Java反射机制和泛型,全自动解析json
有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量 Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去 ...
- Java反射机制和动态代理实例
反射机制是Java语言的一个重要特性,允许用户动态获取类的信息和动态调用对象的方法. 通过给定类的名字,通过反射机制就可以获取类的所有信息. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道 ...
- Java反射机制解析
Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- java基础-java反射机制
2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...
- 粗浅看 java反射机制
Java 反射是 Java 被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运 行时透过 Reflection APIs 取得任何一个已知名称的class 的内部信息,包括其 modifi ...
- Java反射机制Reflection
Java反射机制 1 .class文件 2 Class类 3 Class类与反射机制 4 Java反射机制的类库支持及简介 5 反射机制的定义与应用 6 反射机制Demo Java反射机制demo(一 ...
最新文章
- 【Netty】Netty解决粘包和拆包问题的四种方案
- project euler之甚至斐波那契数字(Even Fibonacci numbers)
- Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-上
- 超图桌面版加载3dmax模型基本成功
- 网页设计中的默认字体样式详解
- C#颜色和名称样式对照表【转载】
- filter过滤器_JavaWeb之 Filter(过滤器)
- 查找问题的利器 - Git Bisect
- sharepoint SPFolder的使用
- 【牛客-15121】Call to your teacher(并查集模板)
- java中io创建文件和读取文件
- 转:PHP - .htaccess设置显示PHP错误
- 【转】BAT机器学习面试1000题系列
- 【文学欣赏】《卖米》北京大学首届校园原创文学大赛一等奖
- 第11.27节 Python正则小结:正则静,静则明,明则虚,虚则无为而无不为也
- mysql多条新增字段sql合并为一条新增
- Linux仿Ubuntu图标包,优秀的 Ubuntu 14.04 图标主题
- (更新时间)2021年5月18日 C#.NET笔试题 基础篇
- 机器学习读书笔记之10 - PCA
- 兰理工计算机调剂,2019年兰州理工大学MBA、MIB考研调剂通知
热门文章
- iptables总结
- c# winform快捷键设置
- 不要动态修改 DOM 里面的 id 属性
- pytest框架安装(MacOS)
- Xamarin XAML语言教程构建ControlTemplate控件模板 (二)
- iOS 滚动图滚动到顶部汇总
- python set 排序_python set 排序_如何在Python中使用sorted()和sort()
- win10使用python的strftime有错误_17个常见的Python运行时错误
- python头文件math.h_将常量从.h文件导入到python中
- 事务配置_SSH(五)- 使用注解方式配置事务管理