Java反射机制实例解析

时间:2023-03-09 03:35:45
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种方法