Java - 反射

来源:互联网 发布:软件开发工作汇报 ppt 编辑:程序博客网 时间:2024/05/22 05:29

基本概念

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. 利用Java语言反射机制,可以在运行时对程序进行动态控制,通过反射也可以打破类的包装机制    
  2. 在Java程序运行过程中,每个类被加载后都在内存中产生一个对应的Class对象,  
  3.     主要包括构造器,方法,成员变量等  
  4.     Java中无论一个类生成多少个对象,这些对象都会对应内存中同一个class对象  
  5. 在JDK中,主要由以下类来实现Java反射机制  
  6.     Java.lang.Class类  
  7.         对应类本身    
  8.     Java.lang.reflect.Field类  
  9.         对应类中定义的成员变量    
  10.     Java.lang.reflect.Method类  
  11.         对应类中定义的方法    
  12.     Java.lang.reflect.Constructor类  
  13.         对应类中定义构造方法    
  14.     Java.lang.reflect.Array类  
  15.         对应如何创建数组,为数组变量赋值,取数组值  

获取Class对象的三种方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. 方法一:Class的静态方法传入类的全称    
  2.     Class<?> classType = Class.forName("com.itlwc.MyReflection");    
  3. 方法二:Java内置语法    
  4.     Class<?> classType = MyReflection.class;    
  5. 方法三:使用对象的getClass()  
  6.     Class<?> classType = new String("abc").getClass();  

Class常用方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.itlwc;  
  2.   
  3. import java.lang.reflect.Constructor;  
  4. import java.lang.reflect.Field;  
  5. import java.lang.reflect.Method;  
  6.   
  7. public class Test {  
  8.     public static void main(String[] args) throws Exception {  
  9.         // 返回指定类对应的Class对象,如果找不到指定类抛出ClassNotFoundException  
  10.         Class<?> c = Class.forName("com.itlwc.Test");  
  11.   
  12.         // 返回Class对象自己定义所有构造器  
  13.         Constructor<?> c1 = c.getDeclaredConstructor();  
  14.         // 返回Class对象自己定义所有构造器  
  15.         Constructor<?>[] c2 = c.getDeclaredConstructors();  
  16.         // 返回Class对象自己定义public构造器  
  17.         Constructor<?> c3 = c.getConstructor();  
  18.         // 返回Class对象自己定义public构造器  
  19.         Constructor<?>[] c4 = c.getConstructors();  
  20.   
  21.         // 返回Class对象自己定义所有成员变量,不包括父类继承来的成员变量  
  22.         Field f1 = c.getDeclaredField("name");  
  23.         // 返回Class对象自己定义成员变量数组,不包括父类继承来的成员变量  
  24.         Field[] f2 = c.getDeclaredFields();  
  25.         // 返回Class对象自己定义public成员变量,包括父类有访问权限的成员变量  
  26.         Field f3 = c.getField("age");  
  27.         // 返回Class对象自己定义public成员变量数组,包括父类有访问权限的成员变量  
  28.         Field[] f4 = c.getFields();  
  29.   
  30.         // 返回Class对象自己定义所有成员方法,不包括父类继承来的成员方法  
  31.         Method m1 = c.getDeclaredMethod("getName");  
  32.         // 返回Class对象自己定义成员方法数组,不包括父类继承来的成员方法  
  33.         Method[] m2 = c.getDeclaredMethods();  
  34.         // 返回Class对象自己定义public成员方法,包括父类有访问权限的成员方法  
  35.         Method m3 = c.getMethod("getName");  
  36.         // 返回Class对象自己定义public成员方法数组,包括父类有访问权限的成员方法  
  37.         Method[] m4 = c.getMethods();  
  38.   
  39.         // Class对象所对应类的名称  
  40.         String str1 = c.getName();  
  41.         // Class对象所对应类所在的包  
  42.         Package p = c.getPackage();  
  43.         // 返回源代码中给出的基础类的简称  
  44.         String str2 = c.getSimpleName();  
  45.         // 返回Class对象表示的实体的超类的Class  
  46.         Class<?> cc = c.getSuperclass();  
  47.         // Class对象是否为注解类型  
  48.         boolean b1 = c.isAnnotation();  
  49.         // Class对象是否为匿名内部类  
  50.         boolean b2 = c.isAnonymousClass();  
  51.         // Class对象是否为数组类型  
  52.         boolean b3 = c.isArray();  
  53.         // Class对象是否为枚举类型  
  54.         boolean b4 = c.isEnum();  
  55.         // Class对象是否为接口类型  
  56.         boolean b5 = c.isInterface();  
  57.         // Class对象是否为成员内部类  
  58.         boolean b6 = c.isMemberClass();  
  59.         // 创建加载类的对象  
  60.         Test t = (Test) c.newInstance();  
  61.         t.getName();  
  62.         // Class对象转换为字符串  
  63.         String str3 = c.toString();  
  64.   
  65.     }  
  66.   
  67.     private String name;  
  68.     public String age;  
  69.   
  70.     public String getName() {  
  71.         return name;  
  72.     }  
  73.   
  74.     public void setName(String name) {  
  75.         this.name = name;  
  76.     }  
  77.   
  78.     public Test() {  
  79.     }  
  80.   
  81.     public Test(String name) {  
  82.         this.name = name;  
  83.     }  
  84.   
  85.     private Test(String name, String age) {  
  86.         this.name = name;  
  87.         this.age = age;  
  88.     }  
  89. }  

Field常用方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.itlwc;  
  2.   
  3. import java.lang.reflect.Field;  
  4.   
  5. class PrivateClass {  
  6.     public String name;  
  7.     public String age;  
  8.     private String password;  
  9. }  
  10.   
  11. public class T {  
  12.     public static void main(String[] args) throws Exception {  
  13.         // 获取Class对象  
  14.         Class<?> clazz = PrivateClass.class;  
  15.         Object obj = clazz.newInstance();  
  16.         // 返回Class对象自己定义public成员变量数组,包括父类有访问权限的成员变量  
  17.         Field[] field = clazz.getFields();  
  18.         for (Field f : field) {  
  19.             // 成员变量名称  
  20.             System.out.println(f.getName());  
  21.             // 成员变量类型  
  22.             System.out.println(f.getType());  
  23.             // 成员变量值  
  24.             System.out.println(f.get(obj));  
  25.         }  
  26.         // 返回Class对象自己定义的私有不带参数方法,名称为method1  
  27.         Field f = clazz.getDeclaredField("password");  
  28.         f.setAccessible(true);  
  29.         System.out.println("成员变量名称: " + f.getName() + " 成员变量类型: " + f.getType()  
  30.                 + " 成员变量值: " + f.get(obj));  
  31.     }  
  32. }  

Method常用方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.itlwc;    
  2.     
  3. import java.lang.reflect.Method;    
  4.     
  5. class PrivateClass {    
  6.     private void method1() {    
  7.         System.out.println("调用了无参私有方法");    
  8.     }    
  9.     
  10.     private String method2(String str, int a) {    
  11.         return "调用了有参私有方法: " + str + "今年" + a + "岁";    
  12.     }    
  13. }    
  14.     
  15. public class T {    
  16.     public static void main(String[] args) {    
  17.         // 获取Class对象    
  18.         Class<?> clazz = PrivateClass.class;  
  19.         try {    
  20.             //生成PrivateClass类的一个实例  
  21.             Object obj= clazz.newInstance();  
  22.             // 返回Class对象自己定义成员方法数组,不包括父类继承来的成员方法    
  23.             Method method[] = clazz.getDeclaredMethods();    
  24.             for (Method m : method) {    
  25.                 // 方法名称    
  26.                 m.getName();    
  27.                 // 方法返回值    
  28.                 m.getReturnType();    
  29.                 // 方法参数序列    
  30.                 Class<?>[] c = m.getParameterTypes();    
  31.                 for (Class<?> cc : c) {    
  32.                     System.out.println(cc);    
  33.                 }    
  34.             }    
  35.             // 返回Class对象自己定义的私有不带参数方法,名称为method1    
  36.             Method m = clazz.getDeclaredMethod("method1"new Class[] {});    
  37.             m.setAccessible(true);    
  38.             Object object = m.invoke(obj, null);    
  39.             System.out.println(object);    
  40.     
  41.             // 返回Class对象自己定义的私有带参数方法,名称为method2    
  42.             m = clazz.getDeclaredMethod("method2"new Class[] { String.class,    
  43.                     Integer.TYPE });    
  44.             m.setAccessible(true);    
  45.             object = m.invoke(obj, new Object[] { "lwc"18 });    
  46.             System.out.println(object);    
  47.         } catch (Exception e) {    
  48.             e.printStackTrace();    
  49.         }    
  50.     }    
  51. }  

Constructor常用方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.itlwc;  
  2.   
  3. import java.lang.reflect.Constructor;  
  4.   
  5. class PrivateClass {  
  6.     public PrivateClass() {  
  7.     }  
  8.   
  9.     private PrivateClass(String str) {  
  10.         System.out.println("私有构造器");  
  11.     }  
  12. }  
  13.   
  14. public class T {  
  15.     public static void main(String[] args) throws Exception {  
  16.         PrivateClass pc = new PrivateClass();  
  17.         // 获取Class对象  
  18.         Class<?> clazz = pc.getClass();  
  19.         // 返回Class对象自己定义所有构造器  
  20.         Constructor<?>[] constructor = clazz.getDeclaredConstructors();  
  21.         for (Constructor<?> cc : constructor) {  
  22.             // 构造器名称  
  23.             System.out.println(cc.getName());  
  24.             // 构造器参数序列    
  25.             Class<?>[] c = cc.getParameterTypes();    
  26.             for (Class<?> ccc : c) {    
  27.                 System.out.print(ccc);    
  28.             }  
  29.         }  
  30.     }  
  31. }  

利用反射动态创建数组

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.itlwc;  
  2.   
  3. import java.lang.reflect.Array;  
  4.   
  5. public class Test {  
  6.     public static void main(String[] args) throws Exception {  
  7.         // 使用反射动态创建长度为5的一维int型数组  
  8.         int[] intArray = (int[]) Array.newInstance(Integer.TYPE, 5);  
  9.         // 使用反射动态创建二维String型数组,一维长度为5,二维长度为4  
  10.         String[][] stringArray = (String[][]) Array.newInstance(String.class,  
  11.                 new int[] { 54 });  
  12.     }  
  13. }  
0 0