获取Class对象的三种方式
1.对象的getClass方法
2.类的class属性
3.class.forName("类的路径")方法
ReflectDemo demo = new ReflectDemo(); Class ReflectClass = demo.getClass(); System.out.println(ReflectClass.getName()); Class ReflectClass2 = ReflectDemo.class; System.out.println(ReflectClass2.getName()); System.out.println(ReflectClass2 == ReflectClass); Class ReflectClass3 = null; try { ReflectClass3 = Class.forName("reflect.ReflectDemo"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(ReflectClass == ReflectClass3);
获取构造函数
Class<?> reflect = Class.forName("reflect.ReflectConstructor"); Constructor[] array = reflect.getConstructors(); //获取所有非私有构造函数 for (Constructor c : array){ System.out.println(c); } System.out.println("-----------"); Constructor[] array2 = reflect.getDeclaredConstructors();//获取所有构造函数(包括私有构造) for (Constructor c : array2){ System.out.println(c); } System.out.println("-------------"); Constructor<?> constructor = reflect.getConstructor(String.class);//获取单个特定的非私有构造函数 Constructor constructor1 = reflect.getDeclaredConstructor(int.class); //获取单个特定的构造函数 ReflectConstructor reflectConstructor = (ReflectConstructor) constructor.newInstance("abc"); constructor1.setAccessible(true); constructor1.newInstance(2); }
获取属性
ReflectField obj = new ReflectField(); Class clazz = Class.forName("reflect.ReflectField"); Field[] fields = clazz.getFields(); //获取所有非私有的属性 for(Field field : fields){ System.out.println(field); } System.out.println("-------------------"); fields = clazz.getDeclaredFields();//获取所有属性(包括私有属性) for(Field field : fields){ System.out.println(field); } Field field = clazz.getField("info");//根据属性名获取特定的非私有属性 field.set(obj,"张三"); field = clazz.getDeclaredField("str");//根据属性名获取特定的所有属性 field.setAccessible(true); field.set(obj,"李四"); System.out.println(obj);
获取方法
public static void main(String[] args) throws Exception { ReflectMethod obj = new ReflectMethod(); Class clazz = Class.forName("reflect.ReflectMethod"); Method[] methods = clazz.getMethods();//获取所有非私有方法,包括继承自父类的方法 for(Method m : methods){ System.out.println(m); } System.out.println("-------------"); methods = clazz.getDeclaredMethods();//获取所有的方法 for(Method m : methods){ System.out.println(m); } System.out.println("------------"); Method method = clazz.getMethod("method", String.class, String.class); method.invoke(obj,"work","succ"); System.out.println("---------"); method = clazz.getDeclaredMethod("method", String.class); method.setAccessible(true); method.invoke(obj,"ibetter"); }