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