Class类:代表类。
作用: 得到类名称,类的实现的接口,继承的类..
Class clazz = Class.forName("gz.itcast.c_reflect.Student");
Class parent = clazz.getSuperclass();
Class[] interArray = clazz.getInterfaces();
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);//忽略private修饰符
name.set(obj, "rose");
Object result = name.get(obj);
泛型的作用:
泛型语法(泛型方法,泛型类,泛型接口),泛型关键字(extends/super),反射泛型。
好处:编译时可以发现类型一致性的问题,代码更通用。
泛型关键字(常用于形参接收参数)
List<?> list = getList();
public void add(List<? extends Number> list){
}
public void add2(List<? super Number> list){
}
反射泛型
Class clazz = this.getClass();
Type type = clazz.getGenericSuperclass();
ParameterizedType param = ( ParameterizedType)type;
Type[] types = param.getActualTypeArguments();
Type target = types[0];
targetClass = (Class)target;
注解
Annotation
注解:给程序带上一些标记,从而影响编译器运行程序的结果
注释:提高程序的可读性,对程序运行没有影响
可以在程序上(类,方法,属性)携带信息
属性的类型可以基本数据类型。也可以是数组类型
public @interface Author {
}
Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Author {
String name();
String modifyTime() default "2015-06-25;
String[] address();
}
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
声明注解的使用范围.
TYPE: 注解可以用在类上
FIELD:注解可以用在属性上
METHOD:用在方法上
PARAMETER:用在参数声明上面
CONSTRUCTOR:用在构造方法上面
LOCAL_VARIABLE:用在本地变量上面
@Retention(RetentionPolicy.SOURCE)
RetentionPolicy.SOURCE: 该注解只在源码中有效!
RetentionPolicy.CLASS: 该注解在源码中,和字节码中有效!(默认)
RetentionPolicy.RUNTIME: 该注解在源码中,和字节码中有效,运行字节码的时候有效!
Method m = this.getClass().getMethod("save", null);
Author author = m.getAnnotation(Author.class);
String name = author.name();
String time = author.modifyTime();