---------------------- 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培訓 、期待與您交流! ----------------------