一文搞懂java反射基本API
作者:bug生产者
这篇文章主要为大家介绍了一文搞懂java反射基本API,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
反射
Java提供反射来在运行时状态下动态的获取类的属性、方法等信息,在框架中很多地方都应用到了反射
反射的操作 获取Class对象
获取Class对象的四种方式
// 第一种 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();
反射为属性赋值
反射执行方法
// 通过反射获取方法,并调用 Method method = clazz.getMethod("display"); method.invoke(person);
以上就是一文搞懂java反射基本API的详细内容,更多关于java反射基本API的资料请关注脚本之家其它相关文章!