Java实战指南|初探Java反射,概念解析(一)

240 阅读2分钟

这是我参与更文挑战的第29天,活动详情查看: 更文挑战


概述:

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

反射机制

什么是反射:

在我们了解Java反射之前先思考什么是正射,即程序正常运行的过程。

  • 正射:程序在编译之前就已经被Java虚拟机加载,加载完了所有需要的类。
  • 反射:在编译时并不知道哪个类被加载,在运行时才加载、调用。

总结下来什么是反射机制:反射就是把java类中的各种成分映射成一个个的Java对象,在程序运行时,才会动态获取类的完整结构信息以及调用对应方法的功能。 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

Java反射常用的类

  • Class类:反射的核心类,所有操作都是围绕该类来生成的,通过Class类可以获取类的属性、方法。
  • Field类:表示类的属性。
  • Method类:表示类的方法。
  • Constructor类:表示类的构造方法。

反射的应用

一个对象:

@Data
public class User {
    private String name;
    public int age;
    private char gender;

通过反射获取Class对象

User p = new User();
Class c = p.getClass();
//注:getClass()是Object类中的一个方法,该方法可以返回该对象所属类对应的Class对象。

调用类的class属性

Class c = User.class;
//注:调用类的class属性可以获取该类对应的Class对象,但是要在编译期间就知道类的名称。

使用Class类的forName静态方法

Class c = Class.forName("entity.User");
//注:Class类的forName()方法也可以获取对应的Class对象,该方法需要传入字符串参数,该字符串参数的值是类的全名,要在类名前加完整的包名。

创建对象(任意一种都行)

1、Class c = User.class;
2、User p = (User)c.newInstance();
3、Constructor t = c.getConstructor(String.class,int.class,char.class);
   User p = (User) t.newInstance("张三",18,'男');

访问Class对应类所包含的属性

Class c = User.class;						
Field[] fields = c.getDeclaredFields();					
for (int i = 0; i < fields.length; i++) {
    System.out.println(fields[i].getName());							
    System.out.println(Modifier.toString(fields[i].getModifiers()));	
}
Field field = c.getDeclaredField("name");								
field.setAccessible(true);												
User p = new User();
field.set(p,"张三");														
System.out.println(p.toString());

访问Class对应类所包含的非构造方法

User user = new User();
Class t = user.getClass();
Method[] methods = t.getMethods();					
for (int i = 0; i < methods.length; i++) {
    System.out.println(Modifier.toString(methods[i].getModifiers()));
    System.out.println(methods[i].getName());
    Class[] parameterTypes = methods[i].getParameterTypes();
    for (int j = 0; j < parameterTypes.length; j++) {
        System.out.println(parameterTypes[j].getName());
    }
    System.out.println();
}

Method method = t.getDeclaredMethod("welcome", String.class);		
System.out.println(Modifier.toString(method.getModifiers()));
method.setAccessible(true);
method.invoke(user,"111");					


ok!今天的文章就到这了,希望可以对大家有帮助,有不对的地方希望大家可以提出来的,共同成长;

整洁成就卓越代码,细节之中只有天地