您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了Java中如何通過反射獲取類的信息,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶大家一起來研究并學習一下“Java中如何通過反射獲取類的信息”這篇文章吧。
Java的特點有哪些 1.Java語言作為靜態面向對象編程語言的代表,實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。 2.Java具有簡單性、面向對象、分布式、安全性、平臺獨立與可移植性、動態性等特點。 3.使用Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。
Java中如何通過反射獲取類的信息
1.獲取Field
public class ReflectTest03 { public static void main(String[] args) throws Exception{ //1.獲取整個類 Class studentClass=Class.forName("cn.yujie.bean.Student"); String className=studentClass.getName(); System.out.println(className); System.out.println(studentClass.getSimpleName()); //獲取類中的所有public的Field Field[] fields=studentClass.getFields(); System.out.println(fields.length); //測試數組中只有1個元素 //測試這個field Field f=fields[0]; //取出field的它的名字 String fieldName=f.getName(); System.out.println(fieldName); //獲取所有的Field //獲取所有的Field Field[] fs=studentClass.getDeclaredFields(); System.out.println(fs.length); System.out.println("-----------------"); //遍歷 for(Field field :fs){ //獲取屬性的修飾符列表 //返回的修飾符是一個數字,每個數字是修飾符的代號 int i=field.getModifiers(); //可以將這個代號數字轉換成字符串 String ModifierString = Modifier.toString(i); System.out.print(ModifierString+" "); //獲取屬性的類型 Class fieldType=field.getType(); String fName=fieldType.getSimpleName(); System.out.print(fName+" "); //獲取屬性的名字 System.out.println(field.getName()+" "); System.out.println(); } }}
2.反編譯Field
通過反射機制,反編譯一個類的屬性Field
public class ReflectTest05 { public static void main(String[] args) throws Exception{ //創建這個是為了拼接字符串 StringBuilder s=new StringBuilder(); Class studentClass=Class.forName("cn.yujie.bean.Student"); s.append(Modifier.toString(studentClass.getModifiers())+" class "+studentClass.getSimpleName()+"{"); Field[] fields=studentClass.getDeclaredFields(); s.append(";\n"); for(Field field:fields){ s.append("\t"); s.append(Modifier.toString(field.getModifiers())); s.append(" "); s.append(field.getType().getSimpleName()); s.append(" "); s.append(field.getName()); s.append(";\n"); } s.append("}"); System.out.println(s); }}
3.通過反射機制訪問對象屬性
必須掌握:
怎么通過反射機制訪問一個對象的屬性
給屬性賦值set
獲取屬性的值get
public class ReflectTest07 { public static void main(String[] args) throws Exception{ Class studentClass=Class.forName("cn.yujie.bean.Student"); //使用反射機制,怎么取訪問一個對象的屬性 Object obj=studentClass.newInstance(); //obj就是student對象(底層調用無參數構造方法) //獲取no屬性(根據屬性的名稱獲取Field) Field noFiled=studentClass.getDeclaredField("no"); //給obj對象(Student對象)的no屬性賦值 //s.no=111; //給s對象的no屬性賦值111,三要素,對象,屬性和值 //雖然使用了反射機制,但是三要素還是缺一不可 //注意,反射機制讓代碼復雜了,但是為了一個靈活,這也是值得的。 noFiled.set(obj,222); //給obj對象的no屬性賦值222 //讀取屬性的值 //兩個要素:獲取obj對象no屬性的值 System.out.println(noFiled.get(obj)); //可以訪問私有屬性嗎 Field nameField=studentClass.getDeclaredField("name"); //打破封裝(反射機制的缺點:打破封裝,可能會給不法分子留下機會) nameField.setAccessible(true); //給name屬性賦值 nameField.set(obj,"jackson"); //獲取name屬性的值 System.out.println(nameField.get(obj)); }}
4.可變長度參數
可變長度參數
int… args這就是可變長度參數
語法是:類型…(注意:一定是3個點)
1.可變長度參數要求的參數個數是0-n個
2.可變長度參數在參數列表中必須在最后一個位置上,而且可變長度參數必須只有一個
3.可變長度可以看成一個數組
public class ArgumentsTest { public static void main(String[] args) { m(); m(10); m(20,40); //m("abc");編譯錯誤 m3("ab","cd","def","de9"); String [] strs={"a","b","c"}; m3(strs); } public static void m(int... args){ } //必須在最后一個,且只有1個// public static void m2(String... args1,int...args2){//// } public static void m3(String ...args){ //可以將可變長度參數當成一個數組來看 for(int i=0;i<args.length;i++){ System.out.println(args[i]); } }}
5.反射Method(了解)
public class ReflectTest08 { public static void main(String[] args) throws Exception{ //獲取類了 Class userServiceClass = Class.forName("cn.yujie.service.UserService"); //獲取所有的Method(包括私有的) Method[] methods=userServiceClass.getDeclaredMethods(); System.out.println(methods.length); //2 //遍歷Method for(Method method:methods){ //獲取修飾符列表 System.out.println(Modifier.toString(method.getModifiers())); //獲取方法的返回值類型 System.out.println(method.getReturnType().getSimpleName()); //獲取方法名 System.out.println(method.getName()); //方法的參數列表(一個方法的參數可能有多個) Class[] parameterTypes=method.getParameterTypes(); for(Class parameterType:parameterTypes){ System.out.println(parameterType.getSimpleName()); } } }}
6.反編譯(了解)
public class ReflectTest09 { public static void main(String[] args) throws Exception{ StringBuilder s=new StringBuilder(); Class userServiceClass = Class.forName("cn.yujie.service.UserService"); s.append("public class UserService{ "); s.append(Modifier.toString(userServiceClass.getModifiers())+"class "+userServiceClass.getSimpleName()+"{ "+"\n"); Method[] methods=userServiceClass.getDeclaredMethods(); for(Method method:methods){ s.append("\t"); s.append(Modifier.toString(method.getModifiers())); s.append(" "); s.append(method.getReturnType().getSimpleName()); s.append(" "); s.append(method.getName()); s.append("("); //參數列表 Class[] parameterTypes = method.getParameterTypes(); for(Class parameterType:parameterTypes){ s.append(parameterType.getSimpleName()); s.append(","); } s.append("){}\n"); } //刪除指定下標位置上的字符 s.deleteCharAt(s.length()-1); s.append("}"); System.out.println(s); }}
7.反射機制調用方法
重點:必須掌握,通過反射機制怎么調用一個方法。反射機制讓代碼更具有通用性,將來修改配置文件后,創建的對象不一樣了,調用的方法也不同了,但是java代碼不需要做任何改動,這就是反射的魅力。
public class ReflectTest10 { public static void main(String[] args) throws Exception{ //通過反射機制調用方法 Class userServiceClass = Class.forName("cn.yujie.service.UserService"); //創建對象 Object obj=userServiceClass.newInstance(); //java中有重載,java中通過方法名和形參來區分方法 Method loginMethod=userServiceClass.getDeclaredMethod("login",String.class,String.class); //調用方法 //調用方法有幾個要素 //要素1:對象,要素2:方法名,要素3:參數列表,要素4:返回值 //反射機制中最重要的一個方法:必須記住 //四要素 /* loginMethod方法,obj對象 admin,123是參數列表,retValue是返回值 * */ Object retValue=loginMethod.invoke(obj,"admin","123"); }}
8.反射Constructor
public class ReflectTest11 { public static void main(String[] args) throws Exception{ StringBuilder s=new StringBuilder(); Class vipClass=Class.forName("cn.yujie.bean.Vip"); s.append(Modifier.toString(vipClass.getModifiers())); s.append(" class "); s.append(vipClass.getSimpleName()); s.append("{\n"); //拼接構造方法 Constructor[] constructors=vipClass.getDeclaredConstructors(); for(Constructor constructor:constructors){ s.append("\t"); s.append(Modifier.toString(constructor.getModifiers())); s.append(" "); s.append(vipClass.getSimpleName()); s.append("("); Class[] parameterTypes=constructor.getParameterTypes(); for(Class parameterType:parameterTypes){ s.append(parameterType.getSimpleName()); s.append(","); } if(parameterTypes.length>0) { s.deleteCharAt(s.length() - 1); } s.append("){}\n"); } s.append("}"); System.out.println(s); }}
9.反射機制調用構造方法
public class ReflectTest12 { public static void main(String[] args) throws Exception{ //使用反射機制怎么創建對象 Class vipClass=Class.forName("cn.yujie.bean.Vip"); //調用無參構造方法 Object obj= vipClass.newInstance(); //調用有參數構造方法 //第一步:先獲取到有參數構造方法 Constructor con=vipClass.getDeclaredConstructor(int.class,String.class,String.class,boolean.class); //第二步:調用構造方法new對象 Object newObj=con.newInstance(110,"jackson","1999-10-11",true); System.out.println(newObj); }}
10.獲取父類和父接口
public class ReflectTest13 { public static void main(String[] args) throws Exception { //String舉例 Class stringClass=Class.forName("java.lang.String"); //獲取String的父類 Class superClass=stringClass.getSuperclass(); System.out.println(superClass.getSimpleName()); //獲取String類實現的所有接口 Class[] interfaces=stringClass.getInterfaces(); for(Class in:interfaces){ System.out.println(in.getName()); } }}
以上就是關于“Java中如何通過反射獲取類的信息”的內容,如果改文章對你有所幫助并覺得寫得不錯,勞請分享給你的好友一起學習新知識,若想了解更多相關知識內容,請多多關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。