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

  • 相关阅读:
    如何使用SAP Intelligent Robotic Process Automation自动操作Excel
    OpenSAML 使用引导 IV: 安全特性
    Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
    微服务架构集大成者—Spring Cloud (转载)
    Spring Cloud Eureka 服务注册列表显示 IP 配置问题
    使用 Notification API 开启浏览器桌面提醒
    SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能
    配置 Nginx 的目录浏览功能
    关于 Nginx 配置 WebSocket 400 问题
    Migrate from ASP.NET Core 2.0 to 2.1
  • 原文地址:https://www.cnblogs.com/sincoolvip/p/5732722.html
Copyright © 2020-2023  润新知