java——了解反射

目录

什么是反射?

反射如何获取类信息?

小结:


什么是反射?

               反射是用代码分析类信息的能力

类中有哪些信息:方法、对象、构造器、全局变量、父类、接口等....

反射如何获取类信息?

三种方式

1.通过对象的getClass方法进行获取

2.通过Class.forName()方法获取

3.通过静态属性class可直接获取到该类型对应的Class对象 例如:T.class 将代表匹配的类对象

面试题:反射能不能通过反射访问类的私有信息?

                   可以   将下面代码设置成true

 

 这种方式为暴力反射,写个demo演示一下

获取全局变量信息的方式 Filed:

public class Reflection {
    private String name;

    @Override
    public String toString() {
        return "reflection{" +
                "name='" + name + '\'' +
                '}';
    }
}
class violence{
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Reflection reflection = new Reflection();
        Field name = Reflection.class.getDeclaredField("name");
        name.set(reflection,"小黑子");
        System.out.println(reflection);
    }
}
  name.setAccessible(true);   不加这行代码时运行结果: 

 报错显示 无法直接访问private修饰的私有成员name属性

Exception in thread "main" java.lang.IllegalAccessException: 
Class com.qcby.test.demo.violence can not access a member of class 
com.qcby.test.demo.Reflection with modifiers "private"

添加后:就能够访问name属性了

小结:

反射获取类的全局变量

1. 类对象.getDeclaredFields() 获取所有的全局变量 需要使用Filed[]接收

2. 类对象.getFields() 获取所有的public修饰的全局变量 需要使用Filed[]接收

3. 类对象.getDeclaredField(“变量名”) 能够获取指定的任何修饰符修饰的全局变量信息 需要使用Filed接收

4. 类对象.getField(“变量名”) 能够获取指定的public修饰符修饰的全局变量信息 需要使用Filed接收

返回获取方法 Method:

public class Reflection {
    private String name;

    private void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "reflection{" +
                "name='" + name + '\'' +
                '}';
    }
}
class violence{
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Reflection reflection = new Reflection();
//        Field name = Reflection.class.getDeclaredField("name");
//        name.setAccessible(true);
//        name.set(reflection,"小黑子");
        Method setName = Reflection.class.getDeclaredMethod("setName", String.class);
        setName.setAccessible(true);
        setName.invoke(reflection,"cxk");
        System.out.println(reflection);
    }
}

小结:

获取类的方法的方式

1. 类对象.getDeclaredMethods() : 这种方式 获取所有的 方法信息 Method[]

2. 类对象.getMethods() : 这种方式 获取public修饰的 方法信息 Method[]

3. 类对象.getDeclaredMethod("方法名",所有参数的类型) 获取所有的指定的方法信息 Method

4. 类对象.getMethod("方法名",所有参数的类型) 获取public的指定的方法信息 Method


以上是个人对反射学习后的总结,希望对你有帮助,不足请补充!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值