反射

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 }

 

上一篇:MIT Mini Cheetah机器狗电机CAN驱动方法


下一篇:Scala 方法和函数