Java面试必问(3):Java反射

java不是动态语言,但他有一个动态相关机制:Reflection反射。在运行状态中:

1)对于任意一个实体类,可以获取它的所有属性和方法;
2)对于任意一个对象,可以调用它的方法和属性。

总结来说,动态获取信息以及动态调用对象方法的功能称为java反射机制

正常情况下这样获取对象:

使用import导入所在包;
明确的使用类名称或接口名称定义对象;
通过关键字new进行类对象的实例化;

反射直接利用Object与反射机制的混合调用类中的方法,不需要明确类型的对象,所有的对象使用Object表示。

举例:通过一个字节码文件(.class) 怎样知道这个字节码文件中有什么方法和属性?

方法就是反射。

在JDK中提供了Class对象来保存类的信息。

反射的第一步就是得到Class对象

在JDK中提供了如下方式得到Class对象:

public static void main(String[] args) {
        //方法一Class.forName("路径");:
        try {
            Class.forName("Test1");  //必须是该类的完整路径
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        //方法二(类名.class,推荐使用,代码安全):
        Class clazz=Test1.class;

        //方法三(调用对象的方法):
        Test1 test1=new Test1();
        test1.getClass();
    }

此方法需要有2个条件:

第一,forName中的字符串必须是全限定名;
第二,这个Class类必须在classpath的路径下面,因为该方法会抛出
ClassNotFoundException 的异常。

获取到这个Class对象之后,就可以得到类的各种信息。

获取Class对象
通过反射生成对象
获取方法

getDeclaredMethods()方法返回类或者接口声明的所有方法,但不包括集成的方法。
getMethods()方法返回某个类的所有公有(public)方法。
getmethod()方法返回特定的方法,第一个参数为方法名,后面的参数为方法对应的Class对象。

获取构造器信息
获取类的成员变量信息

getFiled:访问公有的成员变量。
getDeclareField:所有已声明的成员变量。但不能得到其父类的成员变量。
getFileds和getDeclaredFields

调用方法
invoke()方法

下面这篇文章对反射的内容讲的十分详细透彻,推荐阅读,也留存备用:

https://blog.csdn.net/u012562943/article/details/54405941

https://blog.csdn.net/lijizhi19950123/article/details/78141792

https://blog.csdn.net/stranger_bai/article/details/83715604

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值