java反射

什么是java反射?

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

做什么用?

1.动态代理技术中使用反射动态调用实现类的某个方法.
2.和注解联合使用,程序运行期间使用反射技术获取类信息,通过相应的注解进行相应的业务逻辑处理.(举个栗子:spring框架通过反射技术根据相应注解生成相应的实例,来实现依赖注入功能)

简单总结一下,如果你编码中想获取某个类的基本信息,那就用反射就好了.

怎么用?

java.lang.Class 类就是用来描述一个类的信息,Class类中也提供了诸多方法来帮助我们获取相应的类信息,如图:
在这里插入图片描述
英语好的同学可以对类中的注释进行解读,来了解各种方法的用途,英语不好的同学可以打开jdk的api中文文档进行查看个方法的用途,例如:
在这里插入图片描述
其中常用的获取class对象的方法:
1,根据指定类文件获取class对象

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> clazz = Class.forName("springboot.reflect.Person");
        String name = clazz.getName();
        System.out.println(name);
    }
}

相应的执行结果

springboot.reflect.Person

Process finished with exit code 0

2.根据实例对象获取相应的Class对象;

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        Person p = new Person();
        Class<? extends Person> clazz = p.getClass();
        String simpleName = clazz.getSimpleName();
        System.out.println(simpleName);
    }
}

相应执行结果:

Person

Process finished with exit code 0

以上是两种获取Class类的方法,然后可以尽情的使用Class中获取信息的方法了,常用的方法:

在这里插入图片描述
在这里插入图片描述
除了上边的一些获取信息的方法,还有一些判断信息的方法:
在这里插入图片描述
最后还有根据Class类生成对应实例的方法:

Person p = new Person();
        Class<? extends Person> clazz = p.getClass();

        Person person = clazz.newInstance();//根据class生成对应实例

也可以根据从class类中获取的构造方法生成新实例;

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Person p = new Person("张三",18);
        Class<? extends Person> clazz = p.getClass();
        Constructor<? extends Person> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class);
        Person person = declaredConstructor.newInstance("李四", 19);
        System.out.println("ok");
    }
}

debug结果;
在这里插入图片描述
注意下方法名中,带不带Declared的区别,含有这个词汇的方法可以获取class中private修饰的方法或者字段,否则不能获取到private修饰的信息.

最后没有jdk中文API的小伙伴可以去这里拿:

链接:https://pan.baidu.com/s/1V5cbUWeYJHAIrwMJh6BNog
提取码:caud

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值