反射

反射

1.定义:可以在程序运行时,获得任意一个类的所有信息,这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制
2.获取Class实例的四种方法
    ①:.class 
    ②:对象引用.getClass()
    ③:Class.forName("类路径")
    ④:加载器加载
3.哪些类型可以有Class对象:class(外部类、四种内部类)、interface、数组、枚举、引用数据类型 

获取Class实例的四种方法 

/**
 *     ①:.class 
 *     ②:对象引用.getClass()
 *     ③:Class.forName("类路径")
 *     ④:加载器加载
 */
public static void main(String[] args) throws ClassNotFoundException {

    Class clazz1 = User.class; // 1..class

    User user = new User();
    Class<? extends User> clazz2 = user.getClass(); // 2.对象引用.getClass()

    Class<?> clazz3 = Class.forName("com.example.demo.User"); // 3.Class.forName("类路径")

    ClassLoader classLoader = Fanshe1.class.getClassLoader();
    Class<?> clazz4 = classLoader.loadClass("com.example.demo.User"); // 4.加载器

}

 反射的用途

public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, NoSuchFieldException {
    /**
     * 1.Class实例获取所有方法(不包含父类):.getDeclaredMethods()
     *  权限修饰符:Modifier.toString(method.getModifiers())
     *  返回值:method.getAnnotatedReturnType().getType()
     *  方法名:method.getName()
     *
     * 2.Class实例获取某个方法:.getDeclaredMethod("类名",参数类型.class)
     *  无参数就填null
     *  基本数据类型填 基本数据类型.class
     *
     * 3.Class实例获取所有pubilc方法(包含父类):.getMethods()
     *
     * 4..Class实例获取某个pubilc方法:.getMethod()
     * 
     */
    Class clazz = User.class;
    Method[] declaredMethods = clazz.getDeclaredMethods(); // 获取所有方法
    Method declaredMethod = clazz.getDeclaredMethod("getInfo", int.class); // 获取某个方法

    for (Method method : declaredMethods){
        System.out.println(method); // private java.lang.String com.example.demo.User.getInfo()
        System.out.println(Modifier.toString(method.getModifiers())); // private
        System.out.println(method.getAnnotatedReturnType().getType()); // java.lang.String
        System.out.println(method.getName()); // getInfo()
    }

    Method[] methods = clazz.getMethods(); // 获取所有pubilc方法(包含父类)
    Method getInfo = clazz.getMethod("setAge", int.class); // 获取某个pubilc方法

    Field[] declaredFields = clazz.getDeclaredFields(); // 获取所有属性
    Field name = clazz.getDeclaredField("name"); // 获取某个属性

    Field[] fields = clazz.getFields(); // 获取所有public属性
    Field name1 = clazz.getField("age"); // 获取单个public属性

    clazz.getDeclaredConstructors(); // 获取所有构造器
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月下未来

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

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

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

打赏作者

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

抵扣说明:

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

余额充值