java反射

简介: java反射

一. 什么是反射?

概念:反射是java语言的一种机制,通过这种机制,可以动态的实例化对象、读取属性、调用方法。

二. 什么是类类

类类其实指的就是Java中的class类。

Class类是Java反射机制的核心,它用于表示一个类的字节码文件,也就是表示一个类的所有信息。

每个Java类都对应着一个Class对象,这个对象描述了该类的结构信息。它可以让程序在运行时获取类的名称、修饰符、父类、实现的接口、构造方法、字段、方法等类别信息。

三. 类类的获取方式

1.Class.forname(“类的全路径名”)

适用于从配置文件或其他动态输入中获取类的全限定名,动态加载类。

2.类实例.getclass()

适用于已经在程序中存在对象,需要获取该对象所属的类的Class对象。

3.类名.class

适用于在编写源代码时就已经确定要使用的类,且该类已经在代码中引用过。

实体类

package com.xissl.reflect;
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());
  }
}

获取方式:

package com.xissl.reflect;
/**
 * 类类(class类)的获取方式:一切反射的操作都从获取类对象开始
 * 1.Class.forname
 * 2.类实例.getclass()
 * 3.类名.class
 * @author xissl
 */
public class Demo01 {
  public static void main(String[] args) throws Exception {
    Student stu = new Student();
    //1.Class.forname 类的全路径名
    Class class1 = Class.forName("com.xissl.reflect.Student");
    System.out.println(class1);
    //2.类实例.getclass() 通用增删改
    Class class2 = stu.getClass();
    System.out.println(class2);
    //3.类名.class 通用查询
    Class class3 = Student.class;
    System.out.println(class3);
  }
}

四. 反射实例化

Java反射机制提供了通过Class对象实例化一个类的功能。这个功能的实现一般是通过Class类中的newInstance()方法来实现的。

1.无参构造器

newInstance()方法只能调用类的默认无参构造器,所以这种方式只能实例化没有参数的类。

2.有参构造器

如果想要调用有参构造器,使用getConstructor()方法获取Constructor对象,再用newInstance()方法来实例化有参数的类。

3.私有的有参构造器

如果要调用私有的有参构造器,可以使用getDeclaredConstructor()方法获取Constructor对象,然后,使用setAccessible()方法打开私有修饰符的访问权限,并使用newInstance()方法来实例化对象。

代码如下:

package com.xissl.reflect;
import java.lang.reflect.Constructor;
/**
 * 反射实例化
 * 反射默认调用的是无参构造器
 * @author xissl
 *
 */
public class Demo02 {
  public static void main(String[] args) throws Exception {
    Class class1 = Class.forName("com.xissl.reflect.Student");
    //1.调用无参构造器反射实例化
    Student s1 = (Student) class1.newInstance();
    System.out.println(s1);
    //2.调用有一个参数的构造器实例化
    //括号里面填的是参数的类别 
    Constructor cr1 = class1.getConstructor(String.class);
    Student s2 = (Student) cr1.newInstance("s001");
    System.out.println(s2);
    //3.调用有两个参数的构造器实例化
    Constructor cr2 = class1.getConstructor(String.class,String.class);
    Student s3 = (Student) cr2.newInstance("s002","nb");
    System.out.println(s3);
    //4.调用私有的带一个参数的构造器实例化
    Constructor cr3 = class1.getDeclaredConstructor(Integer.class);
    //打开私有修饰符的访问权限
    cr3.setAccessible(true);
    Student s4 = (Student) cr3.newInstance(20);
    System.out.println(s4);
  }
}

需要注意的是,调用私有构造函数可能会破坏封装性和安全性,所以建议在特定情况下再使用。

五. 反射动态方法调用

在Java中,方法是类的行为,定义了对象可以执行的操作。使用反射技术调用对象的方法,在不知道类信息的情况下,可以使程序更加灵活和智能。

使用反射机制动态调用对象的方法,一般是通过Method类中的invoke()方法来实现的。

1. 无参方法

通过getMethod()方法,先获取方法对象,再调用方法对象的invoke()方法。无参方法parameterTypes不需要写,直接删掉。

name: 要调用的方法名

parameterTypes:参数类型

obj:类实例

args:参数值

2.有参方法

通过getMethod()方法,先获取方法对象,再调用方法对象的invoke()方法。

3.私有的有参方法

如果方法是私有的或受保护的,也同样可以使用setAccessible()方法访问该方法。

六. 反射读写属性

在Java中,属性是对象的状态,定义了对象所具有的特征。使用反射机制读写对象的属性,在不知道类信息的情况下,可以使程序更加灵活和智能。

使用反射机制读写对象的属性,一般是通过Field类中的get()和set()方法来实现的。

package com.xissl.reflect;
import java.lang.reflect.Field;
/**
 * 反射读写属性
 * @author xissl
 *
 */
public class Demo04 {
  public static void main(String[] args) throws Exception {
    //一切反射从类类开始
    Class class1 = Class.forName("com.xissl.reflect.Student");
    Student student = new Student("s001", "yh");
    //写
    Field snameField = class1.getDeclaredField("sname");
    snameField.setAccessible(true);
    snameField.set(student, "sb");
    //获取属性对象 读
    Field[] f = class1.getDeclaredFields();
    for (Field field : f) {
      field.setAccessible(true);
      System.out.println(field.getName()+":"+field.get(student) );
    }
  }
}

在使用反射读写对象的属性时,如果访问的属性是私有的或受保护的,也需要使用setAccessible()方法将其设置为可访问。

相关文章
|
27天前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
1月前
|
Java
Java的反射
Java的反射。
28 2
|
2月前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
37 0
[Java]反射
|
3月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
75 9
Java——反射&枚举
|
2月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 2
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
20 0
|
3月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
3月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)
|
3月前
|
Java
扫盲java基础-反射(二)
扫盲java基础-反射(二)