# JAVA反射 **Repository Path**: blueskyfish/java-reflection ## Basic Information - **Project Name**: JAVA反射 - **Description**: No description available - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-19 - **Last Updated**: 2021-01-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JAVA反射 # JAVA获取类模板方法 * 1.已知具体的类 > 若已经知道某个具体的类,可以通过类的class属性获取,该方法最为安全,效率最高 Class clazz = String.class; * 2.已知某个具体实例 > 若已经知道某个类的具体实例,可以通过实例的getClass()方法获取类模板,Class clazz = instance.getClass() * 3.已知某个类的类全名 > 已知某个类的类全名,且该类在类路径下,可以通过Class的静态方法forName()来获取,Class clazz = Class.forName("java.lang.String") * 4.通过类加载器 > 若已经知道某个类的类全名,且能够获取到一个类加载器,则可以通过类加载器的loadClass()方法获取,Class clazz = this.getClass().getClassLoader().loadClass("java.lang.String") ``` public class Example { private String name; public Example(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } Class clazz = Example.class; System.out.println(clazz); Example example = new Example(); clazz = example.getClass(); System.out.println(clazz); clazz = Class.forName("com.reflection.basic.Example"); System.out.println(clazz); clazz = Test.class.getClassLoader().loadClass("com.reflection.basic.Example"); System.out.println(clazz); ``` # JAVA通过反射获取实例 * 1.通过类模板 > 通过类模板的newInstance方法获取实例,只能默认调用无参构造方法 ``` Class clazz = Class.forName("com.reflection.basic.Example"); Object intance = clazz.newInstance(); ``` * 2.通过构造器 > 因为获取构造器时可以获取特定参数的构造器,所以通过构造器可以调用不同的构造器获取实例 ``` //获取类模板 Class clazz = Class.forName("com.reflection.basic.Example"); //根据构造器的参数类型获取类的相应的构造器 Constructor constructor = (Constructor)clazz.getConstructor(String.class); //通过构造方法获取对应的实例 Example example = constructor.newInstance("your name"); ``` # JAVA通过反射调用方法 ``` //获取类模板 Class clazz = Class.forName("com.reflection.basic.Example"); //根据构造器的参数类型获取类的相应的构造器 Constructor constructor = (Constructor)clazz.getConstructor(String.class); //通过构造方法和参数获取对应的实例 Example example = constructor.newInstance("your name"); //通过类模板获取类方法 Method getName = clazz.getDeclaredMethod("getName"); //通过反射方式调用类的方法,第一个参数为类的实例 Object name = getName.invoke(example); System.out.println(name); ```