Java 反射

markdown ## 概述 ```text 每个Class都对应着一个运行实例 ``` ### 简易实例 ```text Class personalClass = Personal.class; try { Constructor constructor = personalClass.getConstructor(Integer.class, String.class, Double.class); #newInstance 时必须提供相应的构造器 Personal dashwood = constructor.newInstance(2132, "dashwood", 170.1); Field id = personalClass.getDeclaredField("id"); id.set(dashwood,1111); System.out.println(dashwood); #调用公共方法 Method hashCode = personalClass.getDeclaredMethod("hashCode"); System.out.println(hashCode.invoke(dashwood)); ``` ### 调用私有结构 ```text Class personalClass = Personal.class; try { Constructor declaredConstructor = personalClass.getDeclaredConstructor(String.class); Personal test = declaredConstructor.newInstance("Test"); System.out.println(test); Field name = personalClass.getDeclaredField("name"); name.setAccessible(true); name.set(test,"hello world"); System.out.println(test); } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException | NoSuchFieldException e) { throw new RuntimeException(e); } } ``` ### ClassLoader ```text 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆 中生成一个代表这个类的java.long.Class对象,作为方法区中类数据的访问入口 1. 引导类加载器 2. 拓展类加载器 3. 系统类加载器 ``` ```text ClassLoader classLoader = ClassName.class.getClassLoader(); System.out.println(classLoader); System.out.println(classLoader.getParent()); ``` ### 获取类的属性结构 ```text Field[] declaredFields = personalClass.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField); } ``` ### 获取类的方法 ```text Method[] declaredMethods = personalClass.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { System.out.println(declaredMethod); } ``` ### 获取类的构造器结构 ```text Constructor[] constructors = personalClass.getDeclaredConstructors(); for (Constructor constructor1 : constructors) { System.out.println(constructor1); } ``` *

*[返回教程主页](https://www.monody.net/p/blog-page_3.html)*

*

评论