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种方法

posted @ 2016-08-03 14:11  sincoolvip  阅读(353)  评论(0编辑  收藏  举报