Java 反射机制 详解

java基础(jdk1.8)

**

反射

**

JAVA反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法

      对于任意一个对象,都能调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

常用于在不改变原有代码基础上增加功能
/**
 * 加载器加载类后会有一个类对象
 * 拿到这个类的文件对象(反射)
 * 然后用这个对象实现功能的增加
 */

获取文件对象

1.对象获取


    Demo d = new Demo();
    Class c = d.getClass();
    //c为class文件对象

2.类名获取


    Class c = Demo.class;
    //c为class文件对象

3.Class类静态方法获取


    Class c = Class.forName("package.Demo");//包名.类名
    //c为class文件对象

三者获取的class文件对象相等

运行构造方法

1.获取class文件对象

2.从class文件对象中,获取构造方法


    Class c = Class.forName("package.Demo");//包名.类名
    //获得所有公共构造方法
    Constructor[] cons = c.getConstructors();

    //获取指定构造方法(传参则获取指定构造方法,无参为无参构造)
    Constructor con = c.getConstructor();
    Constructor con1 = c.getConstructor(int.class);

    //运行构造方法
    Object o = con.newInstance();
    Object o1 = con.newInstance(1);
    
    //使用泛型可直接获取需要类的类对象

扩展:

如果被反射的类具有 空参构造方法 并且为public,即可如下操作


    Class c = Class.forName("package.Demo");

    Object object = c.newInstance();

注意:

以上只能执行public修饰的构造方法

执行private修饰则应该使用getDeclaredConstructor()方法(暴力反射)

成员变量

1.获取class文件对象

2.从class文件对象中,获取成员变量


    Class c = Class.forName("package.Demo");//包名.类名
    //获取所有公共成员变量
    Field[] fields = c.getFields();

    //获取指定成员变量(id)
    Field id = c.getField("id");

    //修改参数值
    Object obj = c.newInstance();
    id.set(obj,2);//需要传入指定类(无泛型则Object)

同样private修饰应该使用Declared

方法

1.获取class文件对象

2.从class文件对象中,获取方法


    Class c = Class.forName("package.Demo");//包名.类名
    //获取所有public方法
    Method[] methods = c.getMethods();

    //获取指定方法
    Method method = c.getMethod("eat");
    Method method1 = c.getMethod("eat", int.class);

    //运行方法
    Object obj = c.newInstance();
    method.invoke(obj);
    method1.invoke(obj,1);

上一篇 》类加载过程

下一篇 》Java集合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值