什么是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