您的位置:首页 > 职场人生

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

2012-06-14 17:03 603 查看
---------------------- 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息