国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【轉】非常好的Java反射例子

2019-11-15 01:06:08
字體:
來源:轉載
供稿:網友
【轉】非常好的java反射例子

轉自http://www.douban.com/note/306848299/

原文:

1、Java反射的概念  反射含義:可以獲取正在運行的Java對象。  2、Java反射的功能  1)可以判斷運行時對象所屬的類  2)可以判斷運行時對象所具有的成員變量和方法  3)通過反射甚至可以調用到PRivate的方法  4)生成動態代理  3、實現Java反射的類  1)Class:它表示正在運行的Java應用程序中的類和接口  2)Field:提供有關類或接口的屬性信息,以及對它的動態訪問權限  3)Constructor:提供關于類的單個構造方法的信息以及對它的訪問權限  4)Method:提供關于類或接口中某個方法信息  注意:Class類是Java反射中最重要的一個功能類,所有獲取對象的信息(包括:方法/屬性/構造方法/訪問權限)都需要它來實現  4、編寫Java反射程序的步驟:  1)必須首先獲取一個類的Class對象  例如:  Class c1 = Test.class;  Class c2 = Class.forName(“com.reflection.Test”);  Class c3 = new Test().getClass();  2)然后分別調用Class對象中的方法來獲取一個類的屬性/方法/構造方法的結構  注意:如果要能夠正常的獲取類中方法/屬性/構造方法應該重點掌握如下的反射類  Field  Constructor  Method  示例:此程序例子告訴大家如何操作Class/Field/Constructor/Method等與Java反射相關的類  package com.reflection;  import java.lang.reflect.Constructor;  import java.lang.reflect.Field;  import java.lang.reflect.InvocationTargetException;  import java.lang.reflect.Method;  import java.lang.reflect.Modifier;  public class TestReflection {  private String username;  private String passWord;  private int[] age;  public void setUserName(String username) {  this.username = username;  }  private void setPassWord(String password) {  this.password = password;  }  public static void test01() throws ClassNotFoundException {  Class c1 = TestReflection.class;  Class c2 = Class.forName("com.reflection.TestReflection");  //獲取指定的包名  String package01 = c1.getPackage().getName();  String package02 = c2.getPackage().getName();  System.out.println("package01 = " + package01);  System.out.println("package02 = " + package02);  //獲取類的修飾符  int mod = c1.getModifiers();  String modifier = Modifier.toString(mod);  System.out.println("modifier = " + modifier);  //獲取指定類的完全限定名  String className = c1.getName();  System.out.println("className = " + className);  //獲取指定類的父類  Class superClazz = c1.getSuperclass();  String superClazzName = superClazz.getName();  System.out.println("superClazzName = " + superClazzName);  //獲取實現的接口  Class[] interfaces = c1.getInterfaces();  for (Class t : interfaces) {  System.out.println("interfacesName = " + t.getName());  }  //獲取指定類的成員變量  Field[] fields = c1.getDeclaredFields();  for (Field field : fields) {  modifier = Modifier.toString(field.getModifiers()); //獲取每個  字段的訪問修飾符  Class type = field.getType(); //獲取字段的數據類型所對應的  Class對象  String name = field.getName(); //獲取字段名  if (type.isArray()) { //如果是數組類型則需要特別處理  String arrType = type.getComponentType().getName() +  "[]";  System.out.println("" + modifier + " " + arrType + " "  + name + ";");  } else {  System.out.println("" + modifier + " " + type + " " +  name + ";");  }  }  //獲取類的構造方法  Constructor[] constructors = c1.getDeclaredConstructors();  for (Constructor constructor : constructors) {  String name = constructor.getName(); //構造方法名  modifier = Modifier.toString(constructor.getModifiers()); //獲取訪問修飾符  System.out.println("" + modifier +" " + name + "(");  Class[] paramTypes = constructor.getParameterTypes(); //獲取構造方法中的參數  for (int i = 0; i < paramTypes.length; i++) {  if (i > 0) {  System.out.print(",");  }  if (paramTypes[i].isArray()) {  System.out.println(paramTypes  [i].getComponentType().getName()+"[]");  } else {  System.out.print(paramTypes[i].getName());  }  }  System.out.println(");");  }  //獲取成員方法  Method[] methods = c1.getDeclaredMethods();  for (Method method: methods) {  modifier = Modifier.toString(method.getModifiers());  Class returnType = method.getReturnType(); //獲取方法的返回類型  if (returnType.isArray()) {  String arrType = returnType.getComponentType  ().getName()+"[]";  System.out.print(""+modifier+" " + arrType + " " +  method.getName() + "(");  } else {  System.out.print("" + modifier + " " +  returnType.getName() + " " + method.getName() + "(");  }  Class[] paramTypes = method.getParameterTypes();  for (int i = 0; i < paramTypes.length; i++) {  if (i > 0) {  System.out.print(",");  }  if (paramTypes[i].isArray()) {  System.out.println(paramTypes  [i].getComponentType().getName()+"[]");  } else {  System.out.print(paramTypes[i].getName());  }  }  System.out.println(");");  }  }  public static void test02() throws InstantiationException,  IllegalaccessException, SecurityException, NoSuchMethodException,  IllegalArgumentException, InvocationTargetException {  //反射調用方法,可以通過Method類的invoke方法實現動態方法的調用  //public Object invoke(Object obj, Object... args)  //第一個參數代表對象  //第二個參數代表執行方法上的參數  //若反射要調用類的某個私有方法,可以在這個私有方法對應的Mehtod對象上先  調用setAccessible(true)  Class c1 = TestReflection.class;  TestReflection t1 = (TestReflection) c1.newInstance(); //利用反射來創  建類的對象  System.out.println("username == " + t1.username);  System.out.println("password == " + t1.password);  Method method = c1.getDeclaredMethod("setUserName", String.class);  method.invoke(t1, "Java反射的學習");  System.out.println("username == " + t1.username);  method = c1.getDeclaredMethod("setPassWord", String.class);  method.setAccessible(true);  method.invoke(t1, "反射執行某個Private修飾的方法");  System.out.println("password == " + t1.password);  }  public static void main(String[] args) throws ClassNotFoundException,  SecurityException, IllegalArgumentException, InstantiationException,  IllegalAccessException, NoSuchMethodException, InvocationTargetException {  // test01();  test02();  }  }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彩票| 黎川县| 镇原县| 叶城县| 正定县| 晋州市| 崇左市| 巴马| 平阴县| 辉县市| 阜新市| 科技| 佛山市| 会东县| 报价| 绥芬河市| 平南县| 塔城市| 元阳县| 荆门市| 鲜城| 辽源市| 博罗县| 邢台县| 南涧| 侯马市| 高安市| 枣阳市| 宁夏| 铁岭市| 鄂伦春自治旗| 高雄市| 玉田县| 阿荣旗| 个旧市| 五常市| 大埔县| 嘉禾县| 楚雄市| 三亚市| 连州市|