黑马程序员 -java基础 类加载器注解内省

来源:互联网 发布:北京日上免税店官网mac 编辑:程序博客网 时间:2024/04/28 14:06

---------------------- 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

原创粉丝点击