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种方法
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
本文版权归作者和博客园共有,欢迎转载