java反射机制

简介: java反射机制

1.什么是反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

总结就是:反射就是把java类中的各种成分映射成一个个的Java对象

2.反射的作用

1.运行时动态获取类的信息:在编写代码时,对于类的信息是必须在编译时确定的,但在运行时,有时需要根据某些条件,动态获取某个类的信息,这时就可以使用Java中的反射机制。

2.动态生成对象:反射机制可以在运行时生成对象,这样就可以根据参数的不同,动态的创建不同的类的实例对象。

3.动态调用方法:通过反射机制可以调用类中的方法,不论这些方法是否是公共的,也不论这些方法的参数个数和类型是什么,反射机制都具有这样的能力。

4.动态修改属性:利用反射机制可以获取到类中的所有成员变量,并可以对其进行修改。

5.实现动态代理:利用反射机制可以实现代理模式,通过代理对象完成原对象对某些方法的调用,同时也可以在这些方法的调用前后做一些额外的处理。

3.反射应用

首相我们先实例化一个student

package com.zking.xzs;
/**
 * 学生实体
 * @author biao
 *
 */
public class Student {
  private String sid;
  private String sname;
  public Integer age;
  static{
    System.out.println("加载进jvm中!");
  }
  public Student() {
    super();
    System.out.println("调用无参构造方法创建了一个学生对象");
  }
  public Student(String sid) {
    super();
    this.sid = sid;
    System.out.println("调用带一个参数的构造方法创建了一个学生对象");
  }
  public Student(String sid, String sname) {
    super();
    this.sid = sid;
    this.sname = sname;
    System.out.println("调用带二个参数的构造方法创建了一个学生对象");
  }
  @SuppressWarnings("unused")
  private Student(Integer age) {
    System.out.println("调用Student类私有的构造方法创建一个学生对象");
    this.age = age;
  }
  public String getSid() {
    return sid;
  }
  public void setSid(String sid) {
    this.sid = sid;
  }
  public String getSname() {
    return sname;
  }
  public void setSname(String sname) {
    this.sname = sname;
  }
  public void hello() {
    System.out.println("你好!我是" + this.sname);
  }
  public void hello(String name) {
    System.out.println(name + "你好!我是" + this.sname);
  }
  @SuppressWarnings("unused")
  private Integer add(Integer a, Integer b) {
    return new Integer(a.intValue() + b.intValue());
  }
}

3.1如何拿到这个class

拿到Class方法有三种:

1.Class.forname--应用在jdbc数据库连接中

2.类实例.getclass()---通用增删改

3.类名.class--通用查询

如:

package com.zking.xzs;
/**
 * 类类的获取方式
 * 一切反射的操作都是从类对象开始
 * @author biao
 *
 */
public class Demo1 {
  public static void main(String[] args) throws Exception {
    //1.Class.forname--应用在jdbc数据库连接中
    Class<?> forName = Class.forName("com.ctb.reflect.Student");
    System.out.println(forName);
    Student stu=new Student();
    //2.类实例.getclass()---通用增删改
    Class<? extends Student> class1 = stu.getClass();
    System.out.println(class1);
    //3.类名.class--通用查询
     Class<Student> class2 = Student.class;
    System.out.println(class2);
  }
}

4.反射实例化

对象.newInstance()

这里:newInstance()方法内部实际上调用了无参数构造方法,必须保证无参构造存在才可以。

否则会抛出java.lang.InstantiationException异常。

package com.zking.xzs;
import java.lang.reflect.Constructor;
/**
 * 反射实例化
 * 添加有参构造器,一定要补一个无参构造器
 * @author biao
 *
 */
public class Demo2 {
  public static void main(String[] args) throws Exception {
    //一切反射从类类开始
    Class<Student> c1=Student.class;
    Student stu=new Student();
    //调用无参构造器反射实例化
    Object o=c1.newInstance();
    System.out.println(o);
    //调用1个参数的构造器反射实例化
    Constructor<Student> ct = c1.getConstructor(String.class);
    Student student = ct.newInstance("5869");
    System.out.println(student);
    //调用2个参数的构造器反射实例化
     Constructor<Student> ct1 = c1.getConstructor(String.class,String.class);
          Student s2 = ct1.newInstance("66", "宁波");
          System.out.println(s2);
          //getConstructor方法只能获取到公有的构造器对象
          //调用私有化的构造器反射实例化
          Constructor<Student> ct2 = c1.getDeclaredConstructor(Integer.class);
          //打开私有修饰的访问权限
          ct2.setAccessible(true);
          Student ss = ct2.newInstance(89);
          System.out.println(ss);
  }
}

5.反射实例化的方法调用

如:Method类方法

package com.zking.xzs;
import java.lang.xzs.Method;
/**
 * 反射动态方法调用
 * @author biao
 *
 */
public class Demo3 {
  public static void main(String[] args) throws Exception {
     Student stu = new Student();
          Class c = stu.getClass();
          //反射的无参数方法调用
          //getMethod(?,?)方法名,调用方法要传参数类型
          Method m1 = c.getMethod("66");
          //invoke(?,?)类实例,参数值
          Object invoke = m1.invoke(stu);
          System.out.println(invoke);
          //反射的有参数方法调用
          Method m2 = c.getMethod("学生", String.class);
          System.out.println(m2.invoke(stu, "幺妹"));
          //反射的私有化有参数方法调用
          Method m3 = c.getDeclaredMethod("add", Integer.class, Integer.class);
          m3.setAccessible(true);
          System.out.println(m3.invoke(stu, 90, 10));
  }
}

6.反射读写属性

package com.zking.xzs;
import java.lang.xzs.Field;
/**
 * 反射读写属性
 * 
 * @author biao
 *
 */
public class Demo4 {
  public static void main(String[] args) throws Exception {
    Student stu = new Student("12324", "幺妹");
    stu.age = 3040;
    Class clz = stu.getClass();
    //获取stu实例对象中的所有属性值
    //反射存值
    Field sname = clz.getDeclaredField("sname");
    sname.setAccessible(true);
    sname.set(stu, "现在是");
    //反射获取属性值
    Field[] fields = clz.getDeclaredFields();
    for (Field field : fields) {
      field.setAccessible(true);
      System.out.println(field.getName() + ":" + field.get(stu));
    }
  }
}

总之:

在java框架开发中使用反射机制可以提供更灵活、可扩展的特性。


相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
2月前
|
Java 编译器
探索Java中的异常处理机制
【10月更文挑战第35天】在Java的世界中,异常是程序运行过程中不可避免的一部分。本文将通过通俗易懂的语言和生动的比喻,带你了解Java中的异常处理机制,包括异常的类型、如何捕获和处理异常,以及如何在代码中有效地利用异常处理来提升程序的健壮性。让我们一起走进Java的异常世界,学习如何优雅地面对和解决问题吧!
|
1月前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
125 1
|
1月前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
51 2
|
1月前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
54 2
|
2月前
|
运维 Java 编译器
Java 异常处理:机制、策略与最佳实践
Java异常处理是确保程序稳定运行的关键。本文介绍Java异常处理的机制,包括异常类层次结构、try-catch-finally语句的使用,并探讨常见策略及最佳实践,帮助开发者有效管理错误和异常情况。
104 5
|
1月前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
49 3
|
1月前
|
Java 程序员 UED
深入理解Java中的异常处理机制
本文旨在揭示Java异常处理的奥秘,从基础概念到高级应用,逐步引导读者掌握如何优雅地管理程序中的错误。我们将探讨异常类型、捕获流程,以及如何在代码中有效利用try-catch语句。通过实例分析,我们将展示异常处理在提升代码质量方面的关键作用。
46 3
|
1月前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
2月前
|
Java API 数据库
Java 反射机制:动态编程的 “魔法钥匙”
Java反射机制是允许程序在运行时访问类、方法和字段信息的强大工具,被誉为动态编程的“魔法钥匙”。通过反射,开发者可以创建更加灵活、可扩展的应用程序。
47 2