1反射机制是什么
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2反射机制能做什么
反射机制主要提供了以下功能:
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法;
- 生成动态代理。
3反射机制的相关API
通过一个对象获得完整的包名和类名
package edu.pri.lime.test; public class TestReflect { public static void main(String[] args){ TestReflect reflect = new TestReflect(); // 通过一个对象获得完整的包名和类名 System.out.println(reflect.getClass().getName()); } }
实例化Class类对象
package edu.pri.lime.test; public class TestReflect { public static void main(String[] args) throws ClassNotFoundException{ Class<?> clazzA = Class.forName("edu.pri.lime.test.TestReflect"); Class<?> clazzB = new TestReflect().getClass(); Class<?> clazzC = TestReflect.class; System.out.println(clazzA.getName()); System.out.println(clazzB.getName()); System.out.println(clazzC.getName()); } }
获取一个对象的父类与实现的接口
package edu.pri.lime.test; import java.io.Serializable; public class TestReflect implements Serializable{ private static final long serialVersionUID = -3407476067923921222L; public static void main(String[] args) throws ClassNotFoundException{ Class<?> clazz = Class.forName("edu.pri.lime.test.TestReflect"); // 获取父类 Class<?> clazzSup = clazz.getSuperclass(); System.out.println(clazzSup.getName()); // 获取所有接口 Class<?> clazzInte[] = clazz.getInterfaces(); for(Class<?> in : clazzInte){ System.out.println(in.getName()); } } }
获取某个类中的全部构造函数
package edu.pri.lime.test; import java.io.Serializable; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; public class TestReflect implements Serializable{ private static final long serialVersionUID = -3407476067923921222L; private int id; private String name; public TestReflect() { super(); // TODO Auto-generated constructor stub } public TestReflect(int id) { super(); this.id = id; } public TestReflect(String name) { super(); this.name = name; } public TestReflect(int id, String name) { super(); this.id = id; this.name = name; } public static void main(String[] args) throws ClassNotFoundException{ Class<?> clazz = Class.forName("edu.pri.lime.test.TestReflect"); // 获取所有构造函数 Constructor<?>[] constructors = clazz.getConstructors(); for(Constructor<?> con : constructors){ // 获取构造函数所有参数类型 Class<?>[] paramTypes = con.getParameterTypes(); System.out.print(Modifier.toString(con.getModifiers()) + " "); System.out.print(con.getName() + "("); for(int i = 0;i < paramTypes.length;i++){ if(i < paramTypes.length - 1){ System.out.print(paramTypes[i].getName().substring(paramTypes[i].getName().lastIndexOf(".") + 1) + ","); }else{ System.out.print(paramTypes[i].getName().substring(paramTypes[i].getName().lastIndexOf(".") + 1)); } } System.out.println(");"); } } }
通过反射机制实例化一个类的对象
时间: 2024-10-25 14:48:38