Java中的反射

作者: Arvin Chen 分类: Java 来源: Break易站(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): 允许访问该字段,而不管该字段使用的访问修饰符。

 

使用反射的优点:

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

 

缺点:

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

Java反射的相关章节

Java中的new运算符与newInstance()方法

Java中的instanceof运算符与isInstance()方法

  •   本文标题:Java中的反射 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/5007.html
      微信返利机器人
      免费:淘宝,京东,拼多多优惠券
      腾讯,爱奇艺,优酷的VIP视频免费解析,免费看
      即刻扫描二维码,添加微信机器人!

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注