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反射机制实例解析相关推荐

  1. 深入探索Java反射机制:解析原理与应用

    深入探索Java反射机制:解析原理与应用

  2. [转]Java反射机制详解

    目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...

  3. java invoke 泛型_利用Java反射机制和泛型,全自动解析json

    有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去 ...

  4. Java反射机制和动态代理实例

    反射机制是Java语言的一个重要特性,允许用户动态获取类的信息和动态调用对象的方法. 通过给定类的名字,通过反射机制就可以获取类的所有信息. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道 ...

  5. Java反射机制解析

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  6. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  7. java基础-java反射机制

    2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...

  8. 粗浅看 java反射机制

    Java 反射是 Java 被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运 行时透过 Reflection APIs 取得任何一个已知名称的class 的内部信息,包括其 modifi ...

  9. Java反射机制Reflection

    Java反射机制 1 .class文件 2 Class类 3 Class类与反射机制 4 Java反射机制的类库支持及简介 5 反射机制的定义与应用 6 反射机制Demo Java反射机制demo(一 ...

最新文章

  1. 【Netty】Netty解决粘包和拆包问题的四种方案
  2. project euler之甚至斐波那契数字(Even Fibonacci numbers)
  3. Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-上
  4. 超图桌面版加载3dmax模型基本成功
  5. 网页设计中的默认字体样式详解
  6. C#颜色和名称样式对照表【转载】
  7. filter过滤器_JavaWeb之 Filter(过滤器)
  8. 查找问题的利器 - Git Bisect
  9. sharepoint SPFolder的使用
  10. 【牛客-15121】Call to your teacher(并查集模板)
  11. java中io创建文件和读取文件
  12. 转:PHP - .htaccess设置显示PHP错误
  13. 【转】BAT机器学习面试1000题系列
  14. 【文学欣赏】《卖米》北京大学首届校园原创文学大赛一等奖
  15. 第11.27节 Python正则小结:正则静,静则明,明则虚,虚则无为而无不为也
  16. mysql多条新增字段sql合并为一条新增
  17. Linux仿Ubuntu图标包,优秀的 Ubuntu 14.04 图标主题
  18. (更新时间)2021年5月18日 C#.NET笔试题 基础篇
  19. 机器学习读书笔记之10 - PCA
  20. 兰理工计算机调剂,2019年兰州理工大学MBA、MIB考研调剂通知

热门文章

  1. iptables总结
  2. c# winform快捷键设置
  3. 不要动态修改 DOM 里面的 id 属性
  4. pytest框架安装(MacOS)
  5. Xamarin XAML语言教程构建ControlTemplate控件模板 (二)
  6. iOS 滚动图滚动到顶部汇总
  7. python set 排序_python set 排序_如何在Python中使用sorted()和sort()
  8. win10使用python的strftime有错误_17个常见的Python运行时错误
  9. python头文件math.h_将常量从.h文件导入到python中
  10. 事务配置_SSH(五)- 使用注解方式配置事务管理