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

时间: 2024-11-02 14:02:24

Java反射机制实例解析的相关文章

【转载】Java反射机制详解

转自:http://baike.xsoftlab.net/view/209.html#3_8 1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类: 在运行时构造任意一个类的对象: 在运行时判断任意一个类所具有的成员变量和方法: 在运行时调用任意一个

java 反射机制的概念

java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详见下例 ·通过反射机制实例化一个类的对象 ·获取某个类的全部属性 ·获取某个类的全部方法 ·通过反射机制调用某个类的方法 ·通过反射机制操作某个类的属性 ·反射机制的动态代理 4反射机制的应用实例 ·在泛型为Integer的Arr

java反射机制详解和应用

1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类: 在运行时构造任意一个类的对象: 在运行时判断任意一个类所具有的成员变量和方法: 在运行时调用任意一个对象的方法: 生成动态代理. 3反射机制的相关API 通过一个对象获得完整的包名和类名 pub

[转]Java反射机制详解

目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详见下例 ·通过反射机制实例化一个类的对象 ·获取某个类的全部属性 ·获取某个类的全部方法 ·通过反射机制调用某个类的方法 ·通过反射机制操作某个类的属性 ·反射机制的动态代理 4反射机制的应用实例 ·在泛型为Integer的ArrayList中存放一个String类型的对象. ·通过反射取得并修改数

Java知识总结:Java反射机制(用实例理解)

概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. Java中的反射是一个强大的工具,他能够创建灵活的代码,这些 代码可以在运行时装配,无需在组件之间进行链接,发射允许在编写和执行时,使程序代码能够接入装载到 JVM 中的类的内部信息 .而不是源代码中选定的类协作的代码.这使发射

Java反射机制浅析图+应用实例

Java反射机制浅析图+应用实例 --转载请注明出处:coder-pig 本节引言: 其实很久之前就想归纳一下Java中的这个反射机制了,前些天看了慕课网一个讲反射机制的 视频教程觉得不错,又复习了一下,今天面试了一下午,回来就不想写代码了,就写写关于Java 反射的总结,写些简单的使用例子,最后找了2个Android中反射机制应用的例子,分别是 旧版本SDK利用AIDL + Java反射机制接听与挂断电话以及利用反射机制通过按钮关闭 对话框,后续如果用到会另外总结~ 本节正文: 1.反射的相关

Java反射机制实现微信公众平台XML数据解析

在做微信公众平台开发时,接收消息中有很多种类型的xml消息,比如"文本消息""图片消息""语音消息""视频消息""链接消息""地理位置消息"等等,最初在开发时针对每一种数据格式写了一个实体类,单独做解析,当然这样写的好处是层次分明.但经过尝试之后,用一个统一的实体类消息做处理,更加高效,当然,里面最核心的就是在遍历xml数据时,通过反射的机制动态调用set方法: 1.ReceiveXml

利用Java反射机制和泛型,全自动解析json

有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去执行这个方法 m1 = cls.getDeclaredMethod(getMothodName(fields[j].getName()), String.class); m1.invoke(result,json.getString(fields[j].getName()) ); 利用泛型 去获取这

利用Java反射机制完成XML到对象的解析

对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hashtable,那就能大大加快访问的速度. 由于工作的需要,写了一个解析工具,将XML解析成相应的对象列表.以下是源代码,希望对大家有所帮助,更希望大家帮我来改进这个工具. package com.sp.util; /* * author:hingwu * email:[email protected]