1. 程式人生 > >java中反射知識點總結

java中反射知識點總結

個數 etc tst generated forname 意義 getclass 數據類型 object

  1 package Demo;
  2 
  3 import java.lang.reflect.Constructor;
  4 import java.lang.reflect.Field;
  5 import java.lang.reflect.InvocationTargetException;
  6 import java.lang.reflect.Method;
  7 import java.lang.reflect.Modifier;
  8 
  9 public class Test {
 10 
 11     public static void main(String[] args) {
12 Class clazz; 13 try { 14 //01:clazz = Class.forName("Demo.Student"); 15 //02:clazz=Student.class; 16 clazz=new Student().getClass().getSuperclass();//03:並獲取父類 17 System.out.println(clazz); 18 //獲取基本數據類型的類 byte short int long float double boolean char
19 clazz=Byte.TYPE; 20 //輸出byte 21 System.out.println(clazz); 22 clazz=Short.TYPE; 23 clazz=Integer.TYPE; 24 clazz=Long.TYPE; 25 clazz=Float.TYPE; 26 clazz=Double.TYPE; 27 clazz=Boolean.TYPE;
28 clazz=Character.TYPE; 29 30 //獲取基本數據類型本身的類 class java.lang.Byte 31 clazz=Byte.class; 32 System.out.println(clazz); 33 clazz=Short.class; 34 clazz=Integer.class; 35 clazz=Long.class; 36 clazz=Float.class; 37 clazz=Double.class; 38 clazz=Boolean.class; 39 clazz=Character.class; 40 41 //獲取數組對應的類 例如下為class java.lang.String 42 String [] name=new String[8]; 43 clazz=String[].class; 44 System.out.println(clazz); 45 46 47 48 49 //獲取類中的構造方法 50 //獲取public級別的構造方法 51 clazz=Class.forName("Demo.Student"); 52 //Constructor[] constructors=clazz.getConstructors(); 53 /*for (Constructor constructor : constructors) { 54 System.out.println(constructor); 55 }*/ 56 57 //獲取所有的構造方法 58 Constructor[] constructors=clazz.getDeclaredConstructors(); 59 for (Constructor constructor : constructors) { 60 System.out.println(constructor); 61 } 62 63 //獲取單個public級別的構造方法 64 Constructor c=clazz.getConstructor(Integer.TYPE); 65 66 //獲取各種級別的某個構造方法 67 c=clazz.getDeclaredConstructor(String.class); 68 69 70 71 72 73 74 75 76 77 //使用某個構造方法創建對象 78 c.setAccessible(true); 79 Object object=c.newInstance("小李");//相當於上轉型對象 80 System.out.println(object); 81 82 //直接使用類創建對象,局限與無參 83 Object obj=clazz.newInstance(); 84 System.out.println(obj); 85 //獲取對應構造方法的參數對應的類數組 86 Class [] types=c.getParameterTypes(); 87 for (Class type : types) { 88 //System.out.println(type); 89 } 90 91 //獲取構造方法所在的類 92 Object class1=c.getDeclaringClass(); 93 //System.out.println(class1); 94 95 //獲取構造方法的訪問權限 96 int result=c.getModifiers(); 97 String authority=Modifier.toString(result); 98 //System.out.println(authority); 99 100 //獲取構造方法的名字 101 String constructorName=c.getName(); 102 //System.out.println(constructorName); 103 104 105 106 107 108 109 110 111 112 113 114 //獲取public級別的方法 並且會獲取到繼承的public的方法 115 Method [] methhods=clazz.getMethods(); 116 for (Method method : methhods) { 117 //System.out.println(method.getName()); 118 } 119 120 //獲取本類中的所有的方法 121 Method [] methods1=clazz.getDeclaredMethods(); 122 for (Method method : methods1) { 123 //System.out.println(method.getName()); 124 } 125 126 127 //調用類中的方法 128 //獲取某個方法 129 Method m=clazz.getDeclaredMethod("getName", String.class,Integer.TYPE,int [].class); 130 //以下代表為調用了這個方法,並且傳入了參數 131 m.setAccessible(true);//一般這個方法是私有的才會設置 132 //m.invoke(clazz.getConstructor(Integer.TYPE).newInstance(15), "liyinxia",15,new int[] {0,1,2,3}); 133 134 //獲取方法所在的類 135 Class class2 = m.getDeclaringClass(); 136 //System.out.println(class2); 137 138 //獲取方法的訪問權限 139 /*int res=m.getModifiers(); 140 String authorityName=Modifier.toString(res); 141 System.out.println(authorityName);*/ 142 143 //獲取方法的名字 144 /*String name3=m.getName(); 145 System.out.println(name3);*/ 146 147 //獲取方法的參數 148 /*Object [] parameterTypes=m.getParameterTypes(); 149 for (Object parameterType : parameterTypes) { 150 System.out.println(parameterType); 151 }*/ 152 153 154 //獲取方法的返回值類型 155 Class returnType=m.getReturnType(); 156 //System.out.println(returnType); 157 158 //返回由Method對象表示方法拋出異常類型對應Class對象組成的數組 159 Class [] exceptionTypes = m.getExceptionTypes(); 160 System.out.println("異常的個數"+exceptionTypes.length); 161 /*for (Class exceptionType : exceptionTypes) { 162 System.out.println(exceptionType); 163 }*/ 164 165 166 167 168 //獲取屬性 169 Field shuXing=clazz.getField("name"); 170 171 Object instance=clazz.getDeclaredConstructor().newInstance(); 172 //設置屬性的值 173 shuXing.set(instance, "xiaowang"); 174 //獲取屬性的值 175 String name4=(String) shuXing.get(instance); 176 System.out.println(name4); 177 178 179 180 } catch (NoSuchMethodException e) { 181 e.printStackTrace(); 182 } catch (ClassNotFoundException e) { 183 // TODO Auto-generated catch block 184 e.printStackTrace(); 185 } catch (InstantiationException e) { 186 // TODO Auto-generated catch block 187 e.printStackTrace(); 188 } catch (IllegalAccessException e) { 189 // TODO Auto-generated catch block 190 e.printStackTrace(); 191 } catch (IllegalArgumentException e) { 192 // TODO Auto-generated catch block 193 e.printStackTrace(); 194 } catch (InvocationTargetException e) { 195 // TODO Auto-generated catch block 196 e.printStackTrace(); 197 } catch (NoSuchFieldException e) { 198 // TODO Auto-generated catch block 199 e.printStackTrace(); 200 } catch (SecurityException e) { 201 // TODO Auto-generated catch block 202 e.printStackTrace(); 203 } 204 205 } 206 }

以上代碼已經非常詳細的講述了反射所具有的使用方法。。。。。。。。。仔細研究,其實也很簡單,主要要理解反射存在的意義。

反射:是一種新的操作類中的構造方法,成員變量,普通方法的機制。

java中反射知識點總結