1、两个作用:RTTI(运行时类型识别)、DC(动态创建)。
2、获取class对象的三种方式:getClass(); 、通过.class静态属性、通过Class类中的静态方法forName().
3、获取类的构造方法
getDeclaredConstructors() 返回Constructor对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。 getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class对象所表示的类的所有公共(public)构造方法。 getConstructor() 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共(public)构造方法。 getDeclaredConstructor(数据类型.class) 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。1 public class GetConstructor { 2 public static void main(String[] args) throws Exception{ 3 Class clazz=Users.class; 4 Constructor[] arr= clazz.getDeclaredConstructors();//调取全部构造方法 5 for (Constructor c:arr){ 6 System.out.println(c); 7 } 8 System.out.println("-------------"); 9 Constructor[] arr1= clazz.getConstructors();//调取公共构造方法 10 for (Constructor c:arr1){ 11 System.out.println(c); 12 } 13 System.out.println("-------------"); 14 Constructor c =clazz.getDeclaredConstructor(int.class);//调取全部int类型参数的构造方法 15 System.out.println(c); 16 System.out.println("-------------"); 17 Constructor c1 =clazz.getConstructor(int.class);//调取公共int类型参数的构造方法 18 System.out.println(c1); 19 } 20 }
4、获取类的成员变量 getFields() 返回 Field 类型的一个数组,其中包含Field 对象的所有公共(public)字段。 getDeclaredFields() 返回 Field 类型的一个数组,其中包含Field 对象的所有字段。 getField(String fieldName) 返回一个公共成员的 Field 指定对象。 getDeclaredField(String fieldName) 返回一个 Field 指定对象。
1 public class GetField { 2 public static void main(String[] args) throws Exception{ 3 Class clazz =Users.class; 4 Field[] fields = clazz.getDeclaredFields(); 5 for (Field f:fields) { 6 System.out.println(f); 7 System.out.println(f.getName()); 8 } 9 System.out.println("-------------"); 10 Field[] fields1 = clazz.getFields(); 11 for (Field f:fields1) { 12 System.out.println(f); 13 System.out.println(f.getName()); 14 } 15 System.out.println("-------------"); 16 Field field =clazz.getDeclaredField("usersname"); 17 System.out.println(field); 18 System.out.println("-------------"); 19 Field field1 =clazz.getField("usersname"); 20 System.out.println(field1); 21 } 22 }
5、获取类的方法
getMethods() 返回一个 Method 类型的数组,其中包含所有公共(public)方法。 getDeclaredMethods() 返回一个 Method 类型的数组,其中包含所有方法。 getMethod(String name, Class<?>... parameterTypes)返回一个公共的 Method 方法对象。 getDeclaredMethod(String name, Class<?>... parameterTypes)返回一个方法 Method 对象1 public class GetMethod { 2 public static void main(String[] args) throws Exception{ 3 Class clazz =Users.class; 4 Method[] methods = clazz.getMethods(); 5 for (Method m:methods){ 6 System.out.println(m); 7 System.out.println(m.getName()); 8 } 9 System.out.println("-------------"); 10 Method[] methods1 = clazz.getDeclaredMethods(); 11 for (Method m:methods1){ 12 System.out.println(m); 13 System.out.println(m.getName()); 14 } 15 System.out.println("------------"); 16 Method method=clazz.getMethod("setUsersage", int.class); 17 System.out.println(method.getName()); 18 Method method1=clazz.getDeclaredMethod("suibian"); 19 System.out.println(method1.getName()); 20 } 21 }
6、类的调用方法
1 public class GetMethod2 { 2 public static void main(String[] args) throws Exception{ 3 Class clazz=Users.class; 4 Method method = clazz.getMethod("setUsersname", String.class); 5 //实例化对象 6 Object obj =clazz.newInstance(); 7 //通过setUsersName赋值 8 method.invoke(obj,"xiaoma"); 9 //通过getUsersName获取值 10 Method method1 = clazz.getMethod("getUsersname"); 11 Object obj1 =method1.invoke(obj); 12 System.out.println(obj1); 13 } 14 }
7、获取类的其他信息
1 public class GetClassInfo { 2 public static void main(String[] args) { 3 Class clazz=Users.class; 4 //获取类名 5 System.out.println(clazz.getName()); 6 //获取包名 7 System.out.println(clazz.getPackage().getName()); 8 //获取超类 9 System.out.println(clazz.getSuperclass().getName()); 10 //获取该类实现的所有接口 11 Class[] interfaces = clazz.getInterfaces(); 12 for (Class inter:interfaces){ 13 System.out.println(inter); 14 } 15 } 16 }
8、动态编程案例
1 package com.bjsxt; 2 3 import java.lang.reflect.Method; 4 5 public class Test { 6 public static void main(String[] args) throws Exception { 7 ReflectDemo rd=new ReflectDemo(); 8 if (args != null && args.length > 0) { 9 //获取ReflectDemo的Class对象 10 Class clazz=rd.getClass(); 11 //通过反射获取ReflectDemo所有方法 12 Method[] methods=clazz.getMethods(); 13 for (String str:args){ 14 for (int i=0;i<methods.length;i++){ 15 if (str.equalsIgnoreCase(methods[i].getName())){ 16 methods[i].invoke(rd); 17 break; 18 } 19 } 20 } 21 }else { 22 rd.method1(); 23 rd.method2(); 24 rd.method3(); 25 } 26 } 27 }