• 反射


    Class类

    l  获取Class对象的三种方式

    方式一: 通过Object类中的getObject()方法

    Person p = new Person();

    Class c = p.getClass();

    方式二: 通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单)。

    Class c2 = Person.class;

    方式三: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可)。

    Class c3 = Class.forName("Person");

    l  注意:第三种和前两种的区别

    前两种你必须明确Person类型.

    后面是指定这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了

            

    l  代码演示

    /*

     * 获取.class字节码文件对象的方式

     *      1:通过Object类中的getObject()方法

     *      2: 通过 类名.class 获取到字节码文件对象

     *      3: 反射中的方法,

     *          public static Class<?> forName(String className) throws ClassNotFoundException

     *          返回与带有给定字符串名的类或接口相关联的 Class 对象

     */

    publicclass ReflectDemo {

        publicstaticvoid main(String[] args) throws ClassNotFoundException {

            // 1: 通过Object类中的getObject()方法

            // Person p1 = new Person();

            // Class c1 = p1.getClass();

            // System.out.println("c1 = "+ c1);

     

            // 2: 通过 类名.class 获取到字节码文件对象

            // Class c2 = Person.class;

            // System.out.println("c2 = "+ c2);

     

            // 3: 反射中的方法

            Classc3 = Class.forName("cn.oracle_01_Reflect.Person");// 包名.类名

            System.out.println("c3 = " + c3);

        }

    }

     

    l  Person类

    package cn.oracle_01_Reflect;

    publicclass Person {

        //成员变量

        public String name;

        publicintage;

        private String address;

     

        //构造方法

        public Person() {

            System.out.println("空参数构造方法");

        }

       

        public Person(String name) {

            this.name = name;

            System.out.println("带有String的构造方法");

        }

        //私有的构造方法

        private Person(String name, intage){

            this.name = name;

            this.age = age;

            System.out.println("带有String,int的构造方法");

        }

       

        public Person(String name, intage, String address){

            this.name = name;

            this.age = age;

            this.address = address;

            System.out.println("带有String, int, String的构造方法");

        }

       

        //成员方法

        //没有返回值没有参数的方法

        publicvoid method1(){

            System.out.println("没有返回值没有参数的方法");

        }

        //没有返回值,有参数的方法

        publicvoid method2(String name){

            System.out.println("没有返回值,有参数的方法 name= "+ name);

        }

        //有返回值,没有参数

        publicint method3(){

            System.out.println("有返回值,没有参数的方法");

            return 123;

        }

        //有返回值,有参数的方法

        public String method4(String name){

            System.out.println("有返回值,有参数的方法");

            return"哈哈" + name;

        }

        //私有方法

        privatevoid method5(){

            System.out.println("私有方法");

        }

     

        @Override

        public String toString() {

            return"Person [name=" + name + ", age=" + age + ", address=" + address+ "]";

        }

    }

     通过反射获取构造方法并使用

    publicclass ReflectDemo {

        publicstaticvoid main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {

            //获取Class对象

            Class c = Class.forName("cn.oracle_01_Reflect.Person");//包名.类名

           

            //获取所有的构造方法

            //Constructor[] cons = c.getConstructors();

            Constructor[] cons = c.getDeclaredConstructors();

            for (Constructor con : cons) {

                System.out.println(con);

            }

           

            System.out.println("------------------------");

            //获取一个构造方法

            //public Person()

            Constructor con1 = c.getConstructor(null);

            System.out.println(con1);

           

            //public Person(String name)

            Constructor con2 = c.getConstructor(String.class);

            System.out.println(con2);

           

            //private Person(String name, int age)

            Constructor con3 = c.getDeclaredConstructor(String.class, int.class);

            System.out.println(con3);

           

            //public Person(String name, int age, String address)

            Constructor con4 = c.getDeclaredConstructor(String.class, int.class, String.class);

            System.out.println(con4);

        }

    }

       通过反射方式,可以获取构造方法,私有构造方法,创建对象

    反射机制中,把类中的成员变量使用类Field表示。可通过Class类中提供的方法获取成员变量:

    l  返回一个成员变量

    n  public Field getField(String name) 获取指定的 public修饰的变量

    n  public Field getDeclaredField(String name) 获取指定的任意变量

    l  返回多个成员变量

    n  public Field[] getFields() 获取所有public 修饰的变量

    n  public Field[] getDeclaredFields() 获取所有的 变量 (包含私有)

     

    l  获取成员变量的代码演示:

    publicclass FieldDemo {

        publicstaticvoid main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {

            //获取Class对象

            Class c = Class.forName("cn.oracle_01_Reflect.Person");

           

            //获取成员变量

            //多个变量

            //Field[] fields = c.getFields();

            Field[] fields =  c.getDeclaredFields();

            for (Field field : fields) {

                System.out.println(field);

            }

            System.out.println("-----------------");

            //一个变量

            //public int age;

            Field ageField = c.getField("age");

            System.out.println(ageField);

           

            //private String address

            Field addressField = c.getDeclaredField("address");

            System.out.println(addressField);

        }

    }

  • 相关阅读:
    Docker 介绍
    Docker 教程
    Python 删除文件与文件夹
    Python 读文件
    Python 打开文件(File Open)
    Python 异常处理(Try...Except)
    什么是拜占庭将军问题
    智能合约语言 Solidity 教程系列7
    给代币添加高级功能-代币管理、增发、兑换、冻结等
    一步步教你创建自己的数字货币(代币)进行ICO
  • 原文地址:https://www.cnblogs.com/sy130908/p/11533564.html
Copyright © 2020-2023  润新知