1 反射
1.1 获得类的Class对象
Class c1 = Object.class;
Class c2 = Class.forName("java.lang.Object");
Class c3 = new Object().getClass();
c1和c2会调用Object中的静态代码块且 Class支持泛型
1.2 创建对象Object obj = c1.newInstance();
会调用类的代码块 构造方法
1.3 通过Class中的方法 可以得到类中所有的属性 方法
1.4 如果需要调用方法 通过Method的invoke 赋值需要用到Field中的set 如果需要访问私有变量或方法 需要调用setAccessible
1.5 自定义ClassLoader 重写loadClass findClass等方法 可以实现字节码加密 //java核心技术 卷2 9.1.3
2 枚举
蛮好的总结:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html
3 注解
3.1 元注解
@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:
RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉
RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)
RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息
@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
ElementType.CONSTRUCTOR: 构造器声明
ElementType.FIELD: 成员变量、对象、属性(包括enum实例)
ElementType.LOCAL_VARIABLE: 局部变量声明
ElementType.METHOD: 方法声明
ElementType.PACKAGE: 包声明
ElementType.PARAMETER: 参数声明
ElementType.TYPE: 类、接口(包括注解类型)或enum声明
@Documented将注解包含在JavaDoc中
@Inheried允许子类继承父类中的注解
3.2 自定义注解
3.2.1 定义 通过@interface
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Des {
String name() default "name";
int age();
}
3.2.2 添加注解
@Des(age = 10)
public class Test {
public static void main(String[] args) {
Class<Test> c = Test.class;
if (c.isAnnotationPresent(Des.class)) {//判断是否有Des的注解
Des des = (Des) c.getAnnotation(Des.class);
System.err.println(des.name() + "-----" + des.age());
}
}
}
此外 还有用于方法的 变量的 具体见http://blog.csdn.net/initphp/article/details/37041975
只想到这些