原文连接http://zhhll.icu/2020/08/17/java%E5%9F%BA%E7%A1%80/%E5%8F%8D%E5%B0%84/%E5%8F%8D%E5%B0%84/java
Java提供反射来在运行时状态下动态的获取类的属性、方法等信息,在框架中不少地方都应用到了反射框架
获取Class对象的四种方式code
// 第一种 Class<Person> clazz = Person.class; // 第二种 Person person = new Person(); Class clazz1 = person.getClass(); // 第三种 String className = "com.zhanghe.study.reflect.Person"; Class clazz2 = Class.forName(className); // 第四种 使用类加载器 ClassLoader classLoader = TestClass.class.getClassLoader(); Class clazz3 = classLoader.loadClass(className);
Class clazz = TestConstructor.class; Constructor[] constructors = clazz.getConstructors(); System.out.println("=========clazz.getConstructors()====只能获取到公有的构造器"); for(Constructor constructor : constructors){ System.out.println(constructor); } System.out.println("*****************"); System.out.println("=========clazz.getConstructor()=====获取公有无参构造器"); Constructor constructor = clazz.getConstructor(); System.out.println(constructor); System.out.println("*****************"); System.out.println("=========clazz.getDeclaredConstructors()=====获取全部构造器(包括私有、受保护、默认、公有)"); Constructor[] declaredConstructors = clazz.getDeclaredConstructors(); for(Constructor declaredConstructor : declaredConstructors){ System.out.println(declaredConstructor); } System.out.println("*****************"); System.out.println("=========clazz.getDeclaredConstructor()====获取指定参数类型的构造器"); Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class); System.out.println(declaredConstructor); System.out.println("*****************");
System.out.println("======getFields==========="); // 获取全部的属性 只能获取到该类和父类中public的 Field[] fields = clazz.getFields(); for (Field f : fields){ System.out.println(f.getName()); } System.out.println("======getDeclaredFields==========="); // 获取全部的属性 本类中声明的全部的属性均可以获取到,不能够获取到父类的 Field[] declaredFields = clazz.getDeclaredFields(); for (Field f : declaredFields){ // 获取权限修饰符 int i = f.getModifiers(); String m = Modifier.toString(i); System.out.println("Modifier:"+m); // 获取属性类型 Class type = f.getType(); System.out.println("type:"+type.getTypeName()); // 获取属性名 System.out.println("name:"+f.getName()); }
System.out.println("======getMethods==========="); // 获取本类和父类中全部的public方法 Method[] methods = clazz.getMethods(); for(Method m : methods){ System.out.println(m.getName()); } System.out.println("======getDeclaredMethods==========="); // 获取本类中全部的方法,包括私有方法 父类的没法获取 Method[] declaredMethods = clazz.getDeclaredMethods(); for(Method m : declaredMethods){ // 获取注解 Annotation[] annotations = m.getAnnotations(); // 权限修饰符 System.out.println("Modifier:"+Modifier.toString(m.getModifiers())); // 返回值类型 Class reture = m.getReturnType(); // 形参列表 Class[] params = m.getParameterTypes(); // 方法名 System.out.println(m.getName()); // 异常类型 Class[] exceptions = m.getExceptionTypes(); }
// 获取父类 Class superClass = clazz.getSuperclass(); // 获取带泛型的父类 Type superType = clazz.getGenericSuperclass(); // 获取父类的泛型 if(superType instanceof ParameterizedType){ // 若是存在泛型 Type[] actualTypeArguments = ((ParameterizedType) superType).getActualTypeArguments(); }
// 获取实现的接口 Class[] interfaces = clazz.getInterfaces();
// 获取所在的包 Package aPackage = clazz.getPackage();
// 获取注解 Annotation[] annotations = clazz.getAnnotations();
// 经过反射建立person实例 Person person = clazz.newInstance(); // 经过反射获取类的age属性,并赋值 Field field = clazz.getDeclaredField("age"); field.setAccessible(true); field.set(person,20);
// 经过反射获取方法,并调用 Method method = clazz.getMethod("display"); method.invoke(person);
因为自己的博客百度没有收录,博客地址http://zhhll.icu对象