反射
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(); // 获取所有构造器
}