Java-反射机制

简介: Java-反射机制

                                      一.反射介绍

1.在Java-反射机制是什么?

Java反射是指在程序运行期间,能够查看、检测和修改程序本身的状态或行为。在Java中,反射机制的核心反射API,这是一组可以让你在运行期间获取类和对象信息的API。这些API使你可以检查对象、获取类属性和方法、调用对象方法,以及创建对象实例。

反射API的核心是java.lang.reflect包,该包包含了三个重要的类:Field、Method和Constructor。使用这些类及其相关方法,可以针对某个对象或类进行操作。

反射技术的优点是可以让我们在运行期间创建、检查和操作任何一个类的对象,而且不需要知道该类的具体实现。反射的应用场景比较多,比如:框架开发、Web应用程序开发、注解和自定义注解处理、组件化开发、RPC(远程过程调用)等。

2.Java-反射机制有什么作用

Java反射机制在Java语言中拥有很重要的作用,一些常见的作用分别是:

1. 获取类对象和类信息

使用反射机制可以在运行时获取对象的类信息,包括类名、父类、接口、构造方法、方法、字段等信息。这在类库、框架、组件化开发中尤为重要,可以在不知道类名和类实现的情况下,动态地获取类信息,使用灵活。比如,通过外部配置文件或者在线获取类名,可以反射出对应的类名,然后直接获取该类的实例对象,实现对该类的操作。

2. 动态创建对象和调用方法

使用反射机制可以在运行时动态地创建一个类的对象,并且可以在任何时候调用一个方法。通过在运行期间动态获得方法名、参数类型和返回类型等信息,可以调用不同类的同名方法。这在框架中有广泛应用,可以实现自动化构建,自适应扩展等功能。

3. 实现注解和代理

使用反射机制可以实现注解和代理。通过读取注解信息,可以获取注解中定义的属性和方法,从而实现自定义注解的应用。通过代理,可以实现AOP(面向切面编程)和自动化代理等功能,大大提高代码复用性和可维护性。

4. 实现动态代理

动态代理是通过反射机制实现的,可以在运行期间动态地生成代理对象,实现对不同类的动态代理,弥补了Java单继承的不足。动态代理在AOP中使用广泛,可以在运行时动态地添加一些公共的代码逻辑,比如安全检查、事务管理、日志记录等。

总之,Java反射机制在Java语言中有很重要的作用,可以实现许多灵活性强、可扩展性强、易于维护的功能。它不仅仅限于框架开发、Web应用程序开发、注解和自定义注解处理、组件化开发、RPC(远程过程调用)等领域,还可以应用到很多其他的领域中。

                                  二.反射应用

1.什么叫类类?

在Java中,反射机制是指程序可以在运行时获取和操作Java程序的类、对象、方法等信息的能力。在Java反射中,“类”是一种重要的概念。

1.1 类类的获取方式:一起反射从获取类对象开始

1.1.1代码截屏:

1.1.2源码:
package com.lz.demo;
public class demo2 {
//  类类的获取方式:一起反射从获取类对象开始
//  1.Class.forName   数据库连接需要
//  2.实例化的类名字.getClass()
//  3.类名.class
public static void main(String[] args) throws Exception {
  Student stu=new  Student();
  //jdbc  数据库连接需要
  Class  c1=Class.forName("com.lz.demo.Student");
  System.out.println(c1);
  //通用增删改
  Class c2=stu.getClass();
  System.out.println(c2);
  //通用查询
  Class  c3=Student.class;
  System.out.println(c3);
}
}
1.1.3效果图:
1.1.4总结

上述三个例子分别展示了通过类的全限定名、对象和转义字符获取类对象的方式。

获取到类对象后,就可以使用Class类提供的方法,如getFields()、getDeclaredFields()、getMethods()、getDeclaredMethods()等,来获取和操作类的属性、方法等信息。

总之,在Java反射中,“类”是指使用Class类来获取和操作Java程序的类信息的概念。

2 反射实例化

2.1所有实体类添加有参构成器,一定要有无参构成器

因为和 super()相关

2.2实例

2.2.1代码截图

2.2.2代码效果:

2.2.3源码:
package com.lz.demo;
import java.lang.reflect.Constructor;
public class demo3 {
  public static void main(String[] args) throws Exception {
  /**
   * 反射实例化
   * 所有实体类添加有参构成器,一定要有无参构成器
   * super()相关
   * 
   */
    //一切反射和类类相关
    Class  c=Class.forName("com.lz.demo.Student");  
    //调用没有参数构造器
    Student  s1=(Student) c.newInstance();
    System.out.println(s1);
    //调用有一个参数构造器
//    parameterizedTypes参数类型
  Constructor cr1=c.getConstructor(String.class);
  Student s2 = (Student) cr1.newInstance("s001");
  System.out.println(s2);
  //调用有2个参数构造器
  Constructor cr2=c.getConstructor(String.class,String.class);
  Student s3 = (Student) cr2.newInstance("s001","nb");
  System.out.println(s3);
  //私有化调用有一个参数构造器
//  Constructor cr3=c.getConstructor(Integer.class);
//   java.lang.NoSuchMethodException: com.lz.demo.Student.<init>(java.lang.Integer)
//  getConstructo  公有
  Constructor cr3=c.getDeclaredConstructor(Integer.class);
  cr3.setAccessible(true);//打开私有化访问权限
  Student s4 = (Student) cr3.newInstance(18);
//  java.lang.IllegalAccessException: Class com.lz.demo.demo3 can not access a member of class com.lz.demo.Student with modifiers "private"
  //私有化不可调用
  System.out.println(s4);
  }
}

3.反射动态方法调用

3.1代码截屏:

3.2效果图:

3.3源码:

package com.lz.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class demo4 {
  public static void main(String[] args) throws Exception {
  /**
   * 反射动态方法调用
   */
    Class  c=Student.class; 
    Student  s1=(Student) c.newInstance();
    //调用没有参数方法name  方法名 parameterizedTypes 参数类型
    Method  m1=c.getMethod("hello");
    //obj:类实例      args:参数值  invoke:方法返回值
    Object invoke = m1.invoke(s1);
    System.out.println(invoke);
    //调用有一个参数构方法
   Method  m2=c.getMethod("hello",String.class);
    //obj:类实例      args:参数值  invoke:方法返回值
    Object invoke2 = m2.invoke(s1,"nb");
    System.out.println(invoke2);
  //私有化调用有一个参数构造器
    Method  m3=c.getDeclaredMethod("add",Integer.class,Integer.class);
  m3.setAccessible(true);
  Object invoke3 = m3.invoke(s1, 1,2);
  System.out.println(invoke3);
  }
}

4.反射读写属性

4.1代码截屏:

4.2效果图

4.3源码:

package com.lz.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class demo5 {
  public static void main(String[] args) throws Exception {
  /**
   * 反射读写属性
   */
    Class  c=Student.class; 
    Student student = new  Student("s1", "nb");
    student.age=13;
    //传统
    System.out.println(student.getSid());
    System.out.println(student.getSname());
    //反射优点
    System.out.println("-----------------");
    Field name = c.getDeclaredField("sname");
    name.setAccessible(true);
    name.set(student, "lz");
    Field[] Fields = c.getDeclaredFields();
    for (Field field : Fields) {
      field.setAccessible(true);
      System.out.println(field.getName()+":"+field.get(student));
    }
    //缺点当字段名有很多是就有缺点
          /*
           *在servelt传输数据是就会有这样的情况
           *request.getParementer("id") 
           *
           *Student s = new  Student();
           *s.setid
           *s.setname
           *.....
           */
  }
}
相关文章
|
5月前
|
设计模式 人工智能 安全
AQS:Java 中悲观锁的底层实现机制
AQS(AbstractQueuedSynchronizer)是Java并发包中实现同步组件的基础工具,支持锁(如ReentrantLock、ReadWriteLock)和线程同步工具类(如CountDownLatch、Semaphore)等。Doug Lea设计AQS旨在抽象基础同步操作,简化同步组件构建。 使用AQS需实现`tryAcquire(int arg)`和`tryRelease(int arg)`方法以获取和释放资源,共享模式还需实现`tryAcquireShared(int arg)`和`tryReleaseShared(int arg)`。
262 32
AQS:Java 中悲观锁的底层实现机制
|
3月前
|
人工智能 缓存 安全
Java中的反射机制:深入探索与应用
Java反射机制是程序运行时动态获取类信息并操作类成员的特性,具备高度灵活性,但也伴随性能与安全风险。本文详解反射的基本用法、高级应用及最佳实践,助你掌握这一强大工具的正确使用方式。
136 0
|
5月前
|
人工智能 Java 关系型数据库
Java——SPI机制详解
SPI(Service Provider Interface)是JDK内置的服务提供发现机制,主要用于框架扩展和组件替换。通过在`META-INF/services/`目录下定义接口实现类文件,Java程序可利用`ServiceLoader`动态加载服务实现。SPI核心思想是解耦,允许不同厂商为同一接口提供多种实现,如`java.sql.Driver`的MySQL与PostgreSQL实现。然而,SPI存在缺陷:需遍历所有实现并实例化,可能造成资源浪费;获取实现类方式不够灵活;多线程使用时存在安全问题。尽管如此,SPI仍是Java生态系统中实现插件化和模块化设计的重要工具。
160 0
|
3月前
|
人工智能 前端开发 安全
Java开发不可不知的秘密:类加载器实现机制
类加载器是Java中负责动态加载类到JVM的组件,理解其工作原理对开发复杂应用至关重要。本文详解类加载过程、双亲委派模型及常见类加载器,并介绍自定义类加载器的实现与应用场景。
189 4
|
3月前
|
人工智能 安全 Java
掌握Java反射:在项目中高效应用反射机制
Java反射是一种强大功能,允许程序在运行时动态获取类信息、创建对象、调用方法和访问字段,提升程序灵活性。它在框架开发、动态代理、注解处理等场景中广泛应用,如Spring和Hibernate。但反射也存在性能开销、安全风险和代码复杂性,应谨慎使用。
|
4月前
|
人工智能 Java
Java中的反射机制:深入探索与应用
本文介绍了Java反射机制的基本概念、用途及其实现方式。反射机制允许程序在运行时动态获取类的属性和方法,并调用它们,适用于处理私有成员或权限受限的情况。文章详细讲解了`Class`类的功能,包括获取类的方法、属性、注解、构造器等信息,以及通过四种方式获取`Class`对象的示例代码。此外,还探讨了类加载器、继承关系判断、动态代理等高级内容,展示了如何在运行时创建接口实例并处理方法调用。文末提供了完整的代码示例以加深理解。
Java中的反射机制:深入探索与应用
|
5月前
|
Java 区块链 网络架构
酷阿鲸森林农场:Java 区块链系统中的 P2P 区块同步与节点自动加入机制
本文介绍了基于 Java 的去中心化区块链电商系统设计与实现,重点探讨了 P2P 网络在酷阿鲸森林农场项目中的应用。通过节点自动发现、区块广播同步及链校验功能,系统实现了无需中心服务器的点对点网络架构。文章详细解析了核心代码逻辑,包括 P2P 服务端监听、客户端广播新区块及节点列表自动获取等环节,并提出了消息签名验证、WebSocket 替代 Socket 等优化方向。该系统不仅适用于农业电商,还可扩展至教育、物流等领域,构建可信数据链条。
|
5月前
|
人工智能 JavaScript Java
Java反射机制及原理
本文介绍了Java反射机制的基本概念、使用方法及其原理。反射在实际项目中比代理更常用,掌握它可以提升编程能力并理解框架设计原理。文章详细讲解了获取Class对象的四种方式:对象.getClass()、类.class、Class.forName()和类加载器.loadClass(),并分析了Class.forName()与ClassLoader的区别。此外,还探讨了通过Class对象进行实例化、获取方法和字段等操作的具体实现。最后从JVM类加载机制角度解析了Class对象的本质及其与类和实例的关系,帮助读者深入理解Java反射的工作原理。
107 0
|
7月前
|
缓存 Dubbo Java
理解的Java中SPI机制
本文深入解析了JDK提供的Java SPI(Service Provider Interface)机制,这是一种基于接口编程、策略模式与配置文件组合实现的动态加载机制,核心在于解耦。文章通过具体示例介绍了SPI的使用方法,包括定义接口、创建配置文件及加载实现类的过程,并分析了其原理与优缺点。SPI适用于框架扩展或替换场景,如JDBC驱动加载、SLF4J日志实现等,但存在加载效率低和线程安全问题。
281 7
理解的Java中SPI机制
|
6月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
487 1