Java学习笔记——反射

简介

Java 反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。本节主要讲解 Java 反射机制中的常用类

知识点

  • 反射常用类

什么是反射

反射是 Java 编程语言的一个特性,它提供了在运行时检查和动态调用类、方法、属性的能力。

反射能做什么

反射可以在运行时检查类,接口,方法和变量。还可以实例化对象、调用方法、获取和设置变量值。比如当我们不知道一个类中是否拥有某个方法时,我们就可以使用反射来检查是否拥有这个方法。

 

反射常用类

常用类:

  • Class:Class 类表示正在运行的 Java 程序中的类和接口。
  • Field:提供有关类或接口的单个域的信息和动态访问。如数据类型,访问修饰符,域的名称和值。
  • Method:提供有关类或接口上的单个方法的信息和访问权限。如访问修饰符,返回类型,名称,参数类型和方法的异常类型。
  • Constructor:提供有关类的单个构造函数的信息和访问权限。例如构造函数的访问修饰符,名称和参数类型。
  • Modifier:提供了有关访问修饰符的信息。

Class:

Class 类没有公共构造方法,可以通过以下方法获取 Class 类。

  • Object 提供的 getClass()方法。
  • 类名.Class
  • Class.forName(String className)方法。className 为类的全限定名。

Class 类常用方法:

方法描述
Field getField(String name)获取指定的域对象
Field[] getFields()返回所有的公有域对象数组
Method getDeclaredMethod(String name, Class<?>... parameterTypes)返回指定的方法对象
Method[] getMethods()返回所有的公有方法对象数组
Method[] getDeclaredFields()返回所有方法对象数组
String getName()获取全限定名

更多方法请查阅官方文档

 

编程实战

/home/project/目录下新建ReflectDemo.java

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectDemo {
    public int a;
    private int b;

    public static void main(String[] args) {
        Class<ReflectDemo> reflectDemoClass = ReflectDemo.class;
        //输出所有的域名称
        for (Field declaredField : reflectDemoClass.getDeclaredFields()) {
            //可以通过Modifier将具体的权限信息输出,否则只会显示代表权限的数值
            System.out.println("域:" + declaredField.getName() + " 修饰符:" + Modifier.toString(declaredField.getModifiers()));
        }
        //输出所有的公有域名称
        for (Field field : reflectDemoClass.getFields()) {
            System.out.println("公有域:" + field.getName() + " 修饰符:" + Modifier.toString(field.getModifiers()));
        }
        //输出类的所有方法名
        for (Method declaredMethod : reflectDemoClass.getDeclaredMethods()) {
            System.out.println("方法:" + declaredMethod.getName() + " 修饰符:" + Modifier.toString(declaredMethod.getModifiers()));
        }
    }

    public void fun1() {
    }

    private void fun2() {
    }


}

编译运行:

javac ReflectDemo.java
java ReflectDemo

运行结果:

域:a 修饰符:public
域:b 修饰符:private
公有域:a 修饰符:public
方法:main 修饰符:public static
方法:fun1 修饰符:public
方法:fun2 修饰符:private

 

 

总结

反射虽然提供了强大的能力,但是确会带来很多问题,如性能降低,权限漏洞以及权限问题。所以能不用反射尽量不用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值