zoukankan      html  css  js  c++  java
  • Java中的反射机制


    Java反射机制


    • 反射机制定义

          反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许其对内部成员进行操作。由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制,也会严重影响系统的性能。具体而言,反射机制的主要功能主要有:①得到一个对象所属的类,②获取一个类的所有成员变量和方法,③在运行时创建对象,调用对象的方法。

    • 反射机制的实现

          反射机制获取类的方法有三种,我们分别展示如何获取Reflection包下的Student类

    1. Class.forName("类的路径")         Class Student = Class.forName("Reflection.Student");    //包名+类名
    2. 类名.class                                Class Student = Reflection.Student.class;
    3. 类实例.getClass()                      Student student = new Student();    Class Student = student.getClass();

    Class类中的6个重要方法

    1. getName()方法,返回一个String字符串,显示该类的名称。
      • System.out.println(Student.getName());       //输出: Reflection.Student
    2. newInstance()方法, 由类调用该方法,根据该类的默认构造函数创建类的实例
      • Object o = Student.newInstance();
    3. getClassLoader()方法,返回该类对象的对应的加载器。
    4. getComponentType()方法,返回类的组件类型的数组,如果这个类并不代表一个数组类,此方法返回null。
    5. getSuperClass()方法,返回某子类所对应的直接父类所对应的Class对象。
    6. isArray()方法,判定此Class对象所对应的是否是一个数组对象。
    • 反射机制获取类的属性(所有属性和指定属性)
      • 获取所有属性
    public class Test {
        public static void main(String[] args) {
            //Class Student = Class.forName("Reflection.Student");    //包名+类名
            Class Student = Student.class;
            Field[] fs = Student.getDeclaredFields();
            for(Field field : fs){
                System.out.print(field.getModifiers() + "  ");   ////获得属性的修饰符,例如public,static等等,结果为int型
                System.out.print(field.getType().getSimpleName() + "  ");     //获取属性类型的名称
                System.out.println(field.getName());
            }
        }
    }
    class Student {
        public String name;
        private int id;
        public double score;
        public static String SCHOOLNAME = "Beijing University of Post and Telecommunications";
        public void printName(){
            System.out.println(name);
        }
        public void setID(int ID){
            this.id = ID;
        }
        public static void print(){
            System.out.println("This is a Student class");
        }
    }
    输出结果如下:

    1 String name
    2 int id
    1 double score
    9 String SCHOOLNAME

      • 获取指定属性
    public static void main(String[] args) {
            //Class Student = Class.forName("Reflection.Student");    //包名+类名
            Class Student = Student.class;
            try {
                Field fs = Student.getDeclaredField("id");
                Object o = Student.newInstance();
                fs.setAccessible(true);    //Student对象的id属性为private,只有设置为true才允许在外部直接修改属性值
                fs.set(o, 2018111546);
                System.out.println(fs.get(o));
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    输出结果:
    2018111546
    • 反射机制获取类的方法
      • 获取类的构造方法
        • getDeclaredConstructors()                            //获取类的所有构造方法
        • getDeclaredConstructor(参数类型.class,……)     //获取特定的构造方法
    public class Test {
        public static void main(String[] args) {
            //Class Student = Class.forName("Reflection.Student");    //包名+类名
            Class Student = Student.class;
            Constructor[] con = Student.getConstructors();
            for(Constructor c : con)
                System.out.println(c.toString());
    Constructor c = Student.getConstructor(String.class, int.class, double.class);
    System.out.println(c.toString()); } }
    class Student { public String name; private int id; public double score; public static String SCHOOLNAME = "Beijing University of Post and Telecommunications"; public Student(){ name = "zhangsan"; id = 2018111846; score = 86; } public Student(String name, int id, double score){ this.name = name; this.id = id; this.score = score; } public void printName(){ System.out.println(name); } public void setID(int ID){ this.id = ID; } public static void print(){ System.out.println("This is a Student class"); } }
    输出结果

    public Reflection.Student()
    public Reflection.Student(java.lang.String,int,double)

    public Reflection.Student(java.lang.String,int,double)

      • 获取类的普通方法
        • getDeclaredMethods()                                        //获取所有普通方法
        • getDeclaredMethod("方法名",参数类型.class,……)     //获取指定名称的方法
        • getReturnType()                                               //获取方法的返回类型
        • getParameterTypes()                                         //获得方法的传入参数类型
    public static void main(String[] args) {
            //Class Student = Class.forName("Reflection.Student");    //包名+类名
            Class Student = Student.class;
            Method[] mds = Student.getMethods();
            for(Method m : mds){
                System.out.println(m.getReturnType());
                Class[] classs = m.getParameterTypes();
                for(Class s : classs)
                    System.out.println(s.getName());
            }
        }
    输出结果:
    void
    void
    void
    int
    void
    void
    long
    int
    void
    long
    int
    class java.lang.Class
    boolean
    java.lang.Object
    class java.lang.String
    void
    void 
  • 相关阅读:
    [SPOJ-TTM]To the moon
    [BZOJ1901]Zju2112 Dynamic Rankings
    [算法模板]ST表
    [算法模板]树状数组
    [SPOJ-COT]Count on a tree
    [算法模板]倍增求LCA
    【bzoj 3433】{Usaco2014 Jan} Recording the Moolympics(算法效率--贪心)
    【uva 1152】4 Values Whose Sum is Zero(算法效率--中途相遇法+Hash或STL库)
    【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)
    【uva 10048】Audiophobia(图论--Floyd算法)
  • 原文地址:https://www.cnblogs.com/zhanglei93/p/5887801.html
Copyright © 2011-2022 走看看