谈谈java里面的反射

最通俗的反射讲解,学反射理解这篇就差不多了。

反射机制

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

注意:

  • 知道这个类的所有属性和方法/都能够调用它的任意属性和方法: 之前用private封装的属性,外界创建的对象调用不了,只能通过调用public方法来间接获取这个对象。反射就是说,用反射的方式创建对象,就是什么都可以调用到。
  • 动态获取信息/动态调用方法:

利用反射调用它类中的属性和方法,无视修饰符。

先获取配置文件中的信息,动态获取信息并创建对象和调用方法。

public class ClassLoaderDemo2 {
    
    public static void main(String[] args) throws IOException { 
        //static ClassLoader getSystemClassLoader() 获取系统类加载器 
        //InputStream getResourceAsStream(String name) 加载某一个资源文件
        //==============读取prop配置=============
        //获取系统类加载器 
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        //利用加载器去加载一个指定的文件 //参数:文件的路径(放在src的根目录下,默认去那里加载) //返回值:字节流。 
        InputStream is = systemClassLoader.getResourceAsStream("prop.properties");
        Properties prop = new Properties(); 
        prop.load(is);
        is.close();
        //用反射创建对象并调用方法。
        Class clazz = Class.forName("com.itheima.myreflect2.Student");
        //利用构造器创建对象
        Constructor constructor = clazz.getConstructor();
        Object o = constuctor.newInstance();
        //获取方法对象
        Method methods = clazz.getMethod(prop.getProperty("methonName));
        //运行方法
        method.invoke(o);
    }
}

properties里面写的是className=“包名+类名”,methodName=方法名

获取class类对象的三种方式

先上一张图。

这张图形象的介绍了代码三个阶段获取Class对象的方法。

  • Class.forName(“包名+类名”):推荐这种用法,在硬盘阶段获取字节码对象。
  • 类名.class:这个时候类已经加载到内存了,但未创建对象。
  • 对象.getClass:这个已经创建过对象了,个人感觉这种用法意义不大。
获取构造方法
方法名说明
Constructor<?>[]getConstructors()返回所有公共构造方法对象的数组
Constructor<?>[]getDeclaredConstructors()返回所有构造方法对象的数组
ConstructorgetConstructor(Class<?>…parameterTypes)返回单个公共构造方法对象
ConstructorgetDeclaredConstructor(Class<?>…parameterTypes)返回单个构造方法对象

Constructor用于创建对象的方法

方法名说明
TnewInstance(Object…initargs)根据指定的构造方法创建对象
setAccessible(booleanflag)设置为true,表示取消访问检查
获取成员变量
方法名说明
Field[]getFields()返回所有公共成员变量对象的数组
Field[]getDeclaredFields()返回所有成员变量对象的数组
FieldgetField(Stringname)返回单个公共成员变量对象
FieldgetDeclaredField(Stringname)返回单个成员变量对象

Field类用于给成员变量赋值的方法

方法名说明
voidset(Objectobj,Objectvalue)赋值
Objectget(Objectobj)获取值
获取成员方法
方法名说明
Method[]getMethods()返回所有公共成员方法对象的数组,包括继承的
Method[]getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的
Method getMethod(Stringname,Class<?>…parameterTypes)返回单个公共成员方法对象
Method getDeclaredMethod(Stringname,Class<?>…parameterTypes)返回单个成员方法对象

Method类用于执行方法的方法

方法名说明
Objectinvoke(Objectobj,Object…args)运行方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐大队队长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值