• Tags
  •         
  • www.breakyizhan.com
  •    

    Reflection是一种API,用于在运行时检查或修改方法,类,接口的行为。

    • 在java.lang.reflect包下提供了所需的反射类。
    • Reflection为我们提供了有关对象所属的类的信息,以及可以使用该对象执行的该类的方法。
    • 通过反射,我们可以在运行时调用方法,而不管它们使用的访问说明符。

    Java中的反射

    反射可用于获取有关的信息

    1.  getClass()方法用于获取对象所属的类的名称。
    2. 构造函数 getConstructors()方法用于获取对象所属的类的公共构造函数。
    3. 方法 getMethods()方法用于获取对象所属的类的公共方法。
    // A simple Java program to demonstrate the use of reflection
    import java.lang.reflect.Method;
    import java.lang.reflect.Field;
    import java.lang.reflect.Constructor;
    // class whose object is to be created
    class Test
    {
        // creating a private field
        private String s;
        // creating a public constructor
        public Test()  {  s = "GeeksforGeeks"; }
        // Creating a public method with no arguments
        public void method1()  {
            System.out.println("The string is " + s);
        }
        // Creating a public method with int as argument
        public void method2(int n)  {
            System.out.println("The number is " + n);
        }
        // creating a private method
        private void method3() {
            System.out.println("Private method invoked");
        }
    }
    class Demo
    {
        public static void main(String args[]) throws Exception
        {
            // Creating object whose property is to be checked
            Test obj = new Test();
            // Creating class object from the object using
            // getclass method
            Class cls = obj.getClass();
            System.out.println("The name of class is " +
                                cls.getName());
            // Getting the constructor of the class through the
            // object of the class
            Constructor constructor = cls.getConstructor();
            System.out.println("The name of constructor is " +
                                constructor.getName());
            System.out.println("The public methods of class are : ");
            // Getting methods of the class through the object
            // of the class by using getMethods
            Method[] methods = cls.getMethods();
            // Printing method names
            for (Method method:methods)
                System.out.println(method.getName());
            // creates object of desired method by providing the
            // method name and parameter class as arguments to
            // the getDeclaredMethod
            Method methodcall1 = cls.getDeclaredMethod("method2",
                                                     int.class);
            // invokes the method at runtime
            methodcall1.invoke(obj, 19);
            // creates object of the desired field by providing
            // the name of field as argument to the
            // getDeclaredField method
            Field field = cls.getDeclaredField("s");
            // allows the object to access the field irrespective
            // of the access specifier used with the field
            field.setAccessible(true);
            // takes object and the new value to be assigned
            // to the field as arguments
            field.set(obj, "JAVA");
            // Creates object of desired method by providing the
            // method name as argument to the getDeclaredMethod
            Method methodcall2 = cls.getDeclaredMethod("method1");
            // invokes the method at runtime
            methodcall2.invoke(obj);
            // Creates object of the desired method by providing
            // the name of method as argument to the
            // getDeclaredMethod method
            Method methodcall3 = cls.getDeclaredMethod("method3");
            // allows the object to access the method irrespective
            // of the access specifier used with the method
            methodcall3.setAccessible(true);
            // invokes the method at runtime
            methodcall3.invoke(obj);
        }
    }
    

    输出:

    The name of class is Test
    The name of constructor is Test
    The public methods of class are : 
    method2
    method1
    wait
    wait
    wait
    equals
    toString
    hashCode
    getClass
    notify
    notifyAll
    The number is 19
    The string is JAVA
    Private method invoked

    重要:

      1. 如果我们知道它的名称和参数类型,我们可以通过反射来调用方法。为此,我们使用以下两种方法
        getDeclaredMethod():创建要调用的方法的对象。此方法的语法是

        Class.getDeclaredMethod(name,parametertype)
        name-要创建其对象的方法的名称
        parametertype  - 参数是Class对象的数组

        invoke():要在运行时调用类的方法,我们使用以下方法 -

        Method.invoke(Object,parameter)
        如果该类的方法不接受任何方法 
        参数然后null作为参数传递。
      2. 通过反射,我们可以类对象的帮助下访问类的私有变量和方法,并通过使用上面讨论的对象来调用该方法。为此,我们使用以下两种方法。Class.getDeclaredField(FieldName):用于获取私有字段。返回指定字段名称的Field类型的对象。
        Field.setAccessible(true): 允许访问该字段,而不管该字段使用的访问修饰符。

     

    使用反射的优点:

        • 可扩展性功能:应用程序可以通过使用其完全限定名称创建可扩展性对象的实例来使用外部用户定义的类。
        • 调试和测试工具:调试器使用反射属性来检查类上的私有成员。

     

    缺点:

      • 性能开销:反射操作的性能低于非反射操作,应避免在性能敏感的应用程序中频繁调用的代码段中。
      • 内部曝光:反射代码打破抽象,因此可能会通过升级平台来改变方法。

     
    转载请保留页面地址:https://www.breakyizhan.com/java/5007.html