首页 课程 师资 教程 报名

Java反射机制的应用

  • 2022-10-20 10:20:51
  • 1239次 动力节点

概念:

java反射机制可以动态获取类的各种信息,如方法、属性等。并且可以生成该类的对应实例;可以调用任何对象的任何方法,即jvm(虚拟机)允许代码在运行过程中获取类的内部信息

在使用反射机制时,一个非常重要的Class就是Class,它是由类加载后的 JVM(虚拟机)

java反射机制功能:

在运行时确定任何对象的类

在运行时构造任何类的对象;

在运行时确定任何类的成员变量和方法;

在运行时调用任意对象的方法;

生成动态代理;

反射的优缺点:

优势:

运行时可以判断类型并动态加载类,提高了代码的灵活性。访问不可访问的成员变量等;获取类的方法和成员变量;

缺点:

Java反射相当于一系列解释操作。这个过程需要通知jvm(虚拟机),所以性能比直接源码慢很多。它无法识别编译器中的错误。错误只能在运行时发现,增加了难度

Java反射机制类:

java.lang.Class //类
java.lang.reflect.Constructor //构造方法
java.lang.reflect.Field //类的成员变量
java.lang.reflect.Method //类方法
java.lang.reflect.Modifier //访问权限

反射的应用场景:

模块化开发,通过反射调用对应的字节码;

动态代理设计模式

Spring和hibernate框架等

一个结合注解的框架,如Retrofit

例子:

JDBC编程中,加载数据库驱动时应用反射机制;

Class.forName("com.mysql.jdbc.Driver") 加载驱动类并在DriverManager类中注册驱动类实例。

获取类对象的三种方法

1.使用已知对象的“getClass()”方法,例如:

   /*
       * 如何获取字节码对象:
       * 要使用此方法,您必须指定特定的类并创建对象。
      */
 公共类 GetClassTest {
        /*类的方法和属性*/
        公共静态无效get(){
             GetClassTest 测试 = 新的 GetClassTest();
             Class class = test.getClass();//可以返回<span style = "font family: Arial, Helvetica, sans serif;" > getclasstest 类的类对象</ span>
        }
    }

2.Class.forName("类名"),例如

/*
 * 只要传递给定类的字符串名称,就可以获得该类,扩展性更强。
 * 但是可以通过使用Class中的方法来完成。
 * 这个方法是forName
 * 这种方法只要有名字就更方便,扩展性更好。
 */
公共类 ForNameTest {
    /*类的方法和属性*/
    公共静态无效get(){
         Class class = Class.forName("Package name.RefClass");//加载RefClass Class,生成对应Class对象,初始化RefClass Class;
    }
}

3.类名class,例如:

  /*
   * 任何数据类型都有一个静态属性Class来获取其对应的类图像。
   * 比较简单,但是我们还是需要在类中显式使用静态成员。
   * 扩展不够。
  */
    公共类 ClassTest {
        /*类的方法和属性*/
        公共静态无效get(){
             Class class = RefClass.class;//加载RefClass Class并生成对应的Class对象,但RefClass Class没有初始化;
        }
}

可通过类对象获取的信息

class.getName();//获取类名包含包名的路径
class.getPackage();//获取类的包信息
class.getSimpleName();//获取类名
class.getModifiers();//获取类访问权限
class.getDeclaredClasses();//内部类
class.getDeclaringClass();//外部类
class.getType();//字段类型
班级。getModifiers();//字段访问修饰符
class.getMethods();// 获取类中的所有公共方法,包括父类中的方法
class.getDeclaredMethods();// 获取类中的所有方法,包括公共和私有方法,但不包括父类中的方法
class.isPrimitive();//判断是否为基本类型
class.isArray();//判断是否为集合类
class.isAnnotation();//判断是否为注解类
class.isInterface();//判断是否为接口类
class.isEnum();//判断是否为枚举类
class.isAnonymousClass();//判断是否为匿名内部类
class.isAnnotationPresent(Deprecated.class);//判断是否被注解类修改

获取方法的方法名和参数

//遍历所有方法
for (方法 m : 声明方法){
    // 获取方法名
    System.out.print(m.getName()+"(");
    // 用于判断是否为第一个参数
    布尔 isFrist = true;
    // 获取方法的所有参数类
    类<?>[] parameterTypes = m.getParameterTypes();
    //遍历所有参数   
 for (Class<?> clazz : parameterTypes){
        如果(isFrist){
            System.out.print(clazz.getName());
            isFrist = 假;
        } 别的 {
            System.out.print("," + clazz.getName());
        }
    }
    System.out.println(");");
}

以上就是关于“Java反射机制的应用”介绍,大家如果想了解更多相关知识,不妨来关注一下动力节点的Java在线学习,里面的课程内容细致全面,很适合没有基础的小伙伴学习,希望对大家能够有所帮助哦。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交