zoukankan      html  css  js  c++  java
  • 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种方法

  • 相关阅读:
    新世纪五笔字根实例
    7 天学会新世纪五笔——原来五笔是个拼字游戏
    Ubuntu 上安装使用 ibus-rime(超实用)
    Linux 上安装最新版 Brave Browser
    安装使用 GoldenDict 查词神器 (Windows/Mac/Linux)
    1.2-Physical Ergonomics
    Django
    前端
    python一些简单的入门知识
    触发器、函数、存储过程、视图
  • 原文地址:https://www.cnblogs.com/sincoolvip/p/5732722.html
Copyright © 2011-2022 走看看