zoukankan      html  css  js  c++  java
  • 反射

    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);

        }

    }

  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/sy130908/p/11533564.html
Copyright © 2011-2022 走看看