黑马程序员 -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
- 黑马程序员 -java基础 类加载器注解内省
- Java基础---内省、注解、类加载器 (黑马程序员)
- 黑马程序员--JAVA之内省、注解与类加载器
- 黑马程序员----java内省--注解--类加载器
- 黑马程序员——><基础加强二(内省-注解-泛型-类加载器-代理)>
- 黑马程序员 高新技术<四>--->内省、注解与类加载器
- 黑马程序员——高新技术---内省、注解、类加载器
- 黑马程序员--高新技术--枚举、反射、注解、类加载器、内省
- 黑马程序员——高新技术---内省、注解、类加载器
- 黑马程序员-JAVASE入门(内省、注解、类加载器)
- 黑马程序员——Java高新_内省、注解、类加载器
- 黑马程序员——Java高新技术---枚举、内省、类加载器、注解
- 黑马程序员—【Java高新技术】之内省、注解、类加载器
- 黑马程序员——java高新(枚举、内省、注解、类加载器)
- 黑马程序员--Java基础加强--08内省、类加载器、动态代理
- 黑马程序员--Java基础--14JavaBean,注解,类加载器
- Java基础——内省、注解、类加载器
- 黑马程序员-JAVA基础加强-内省与注解
- Java 高新技术总结
- 黑马程序员-java基础 反射
- 关于ORACLE中CREATE VIEW 的时候用ORDER BY 和 WITH READ ONLY 的问题
- 第十一章 编写代码控制配置和通信(下)
- 接收MessageBox返回值
- 黑马程序员 -java基础 类加载器注解内省
- ios 获取一个view上的图片,iphone混合图片 合成图片 任意范围截图 截屏
- 张龙
- ArcGIS Flex API 中缩放控件样式设计(转帖)
- c# Regex常用
- Lisp语言:函数的可选参数,剩余参数以及关键字参数
- Android getevent/senevent
- TortoiseSVN 使用图解
- 关于全选按钮和复选框只能选中其中一个的js写法