黑馬程序員 -java基礎 類加載器註解內省

---------------------- android培訓java培訓 、期待與您交流! ----------------------

 

ClassLoader  類加載器
java虛擬機中可以安裝多個類加載器,系統默認主要3個類加載器BootStrap、ExtClassLoader、AppClassLoader,他們從左到右是父子關係
類加載器本身也是java類(BootStrap不是java類,因爲其他類加載器本身需要被加載,所以必須有一個加載器不是java類)

類加載器加載原理
每個類加載器加載時,先委託給其上級類加載器,當所有祖宗類加載器沒有加載到類,則回到發起者的類加載器。若還是無法加載,
拋出ClassNotFindExecption ,不會去發起者的子類加載器加載
當然也可以直接調用ClassLoader.loadClass()方法在指定某個類加載器去加載

自定義類加載器:
1 繼承ClassLoader
2 重寫findClass方法 用defineClass方法把二進制數據編譯爲Class文件

class ClassLoaderTest {

 public static void main(String[] args) throws InstantiationException,
   IllegalAccessException, ClassNotFoundException {
  // 新建一個類加載器
  MyClassLoader cl = new MyClassLoader("myClassLoader");
  // 加載類,得到Class對象
  Class<?> clazz = cl.loadClass("classloader.Animal");
  // 得到類的實例
  Animal animal = (Animal) clazz.newInstance();
  animal.say();
 }
}

class Animal {
 public void say() {
  System.out.println("hello world!");
 }
}

public class MyClassLoader extends ClassLoader {
 // 類加載器的名稱
 private String name;
 // 類存放的路徑
 private String path = "E:\\workspace\\Algorithm\\src";

 MyClassLoader(String name) {
  this.name = name;
 }

 MyClassLoader(ClassLoader parent, String name) {
  super(parent);
  this.name = name;
 }

 // 重寫findClass方法
 @Override
 public Class<?> findClass(String name) {
  byte[] data = loadClassData(name);
  return this.defineClass(name, data, 0, data.length);
 }

 public byte[] loadClassData(String name) {
  try {
   name = name.replace(".", "//");
   FileInputStream is = new FileInputStream(new File(path + name
     + ".class"));
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   int b = 0;
   while ((b = is.read()) != -1) {
    baos.write(b);
   }
   return baos.toByteArray();
  } catch (Exception e) {
   e.printStackTrace();
  }
  return null;
 }
}

 

 


獲取配置文件步驟
第一種方法
1 獲取類的字節碼實例對象
2 調用類的字節碼實例對象的 getClassLoader方法,獲取類加載器
3 調用類加載器的getResourceAsStream("路徑名") 獲取文件

第二種方法
1 獲取類的字節碼實例對象
2 調用類的字節碼實例對象的 getResourceAsStream("路徑名") 獲取文件

絕對路徑名通常是通過算法得到。

 

IntroSpector  內省
內省通常用來對javabean進行操作

javabean 是一個特殊的java類
javabean的屬性 如果get或set後面的單詞第二個字母是小寫,則第一個字母變成小寫
PropertyDescriptor 對屬性進行操作的類

步驟:
1 獲取屬性對應的PropertyDescriptor 對象
2 通過PropertyDescriptor 對象的getReadMethod方法和getWriteMethod方法獲取屬性對應
的getter setter方法
3 通過返回的Method對象的invoke方法調用自身

BeanUtils工具包


註解
java5 的新特性  每個註解都相當於一個特殊的類

@SuppressWarnings();取消過時方法的提醒
@Deprecated 把方法標註爲已過時
@Override 重寫父類方法

註解的生命週期
java源文件  @Retention(RetentionPolicy.SOURCE) 
編譯期  @Retention(RetentionPolicy.CLASS)
運行期  @Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD}) 設置註解 用在什麼地方(類  方法...)這裏是設置在方法上

註解中數組只有一個值的時候,可以省略大括號

註解裏面的返回類型只能是 原始類型  String類型  class類型 註解類型 以及前面這些類型的數組

如果註解裏面的成員不設置default 值,則在使用註解的時候必須顯示的賦值。賦值方式成員名=XXX,多個用逗號隔開

自定義註解
創建接口在interface 加上@ 表示這是一個自定義註解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcasAnnotaion {
 String value();
 String save() default "aaa";
 int[] scorec={1,3,4,6,8,9};
 
}

@ItcasAnnotaion(value="123",save="abc")
public class ClassAnnotation {
 public static void main(String[] args) {
  //調用註解裏面的成員
  if (ClassAnnotation.class.isAnnotationPresent(ItcasAnnotaion.class)) {
   ItcasAnnotaion annotaion = ClassAnnotation.class
     .getAnnotation(ItcasAnnotaion.class);
   System.out.println(annotaion.save());
  }

 }
}

 

 ---------------------- android培訓java培訓 、期待與您交流! ----------------------

 

詳細請查看:http://edu.csdn.net/heima

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章