注解和反射
一、注解
annotation:注解
1、什么是注解
作用
- 不是程序本身,可以对程序做出解释。
- 可以被其他程序读取。
格式
@XXXXX(value="")
那里使用
package、class、method、field。
2、元注解
- @Target :用于描述注解的使用范围。
- @Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期。(SOURCER<CLASS<RUNTIME)
- @Document:说明该注解将被包含在Javadoc中。
- @Inherited:说明子类可以继承父类中的该注解。
创建一个简单注解
@Target({ElementType.METHOD,ElementType.TYPE}) //作用到方法上
@Retention(RetentionPolicy.RUNTIME) //表示什么地方有效
@Documented //表示是否将我们的注解生成在JAVAdoc中
@Inherited //子类可以继承父类的注解
public @interface MyAnnotation {
String name() default "666";
int age() default 18;
}
二、反射
1、什么是反射
允许程序在执行期借助Reflection取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
优点:
可以实现动态创建对象和编译,体现出很大的灵活性。
缺点:
对性能有影响,使用反射是一种解释操作,我们可以告诉JVM,我们希望做什么并且他满足我们的要求。
2、API
1、获取class对象。
Class name = Class.forName("Test2.Son");
Class<Son> sonClass = Son.class;
Class<? extends Son> aClass = son.getClass();
Class<Integer> type = Integer.TYPE;
Class<?> superclass = aClass.getSuperclass();//获取父类
什么会有class对象
class,interface,[],enum,annotation,primitive type,void。
2、class对象API。
//获取包名+类的名字
name.getName();
//获取类名
name.getSimpleName();
//获取类的public属性
Field[] fields = name.getFields();
//获取类的全部属性
Field[] declaredFields = name.getDeclaredFields();
//获取指定public属性的值
Field[] value = name.getFields("xxx");
//获取类的方法
name.getMethods();
//获取指定方法
name.getMethod("methodname",paraType);
//获取指定构造器
name.getConstructors();
......
3、获取泛型信息
Class name = Class.forName("Test2.Son");
Method test = name.getMethod("test", List.class);
Type[] types = test.getGenericExceptionTypes();
4、获取注解信息
Class name = Class.forName("Test2.Son");
Method test = name.getMethod("test", List.class);
MyAnnotation annotations = test.getAnnotation(MyAnnotation.class);
System.out.println(annotations.age());
System.out.println(annotations.name());
5、动态执行方法
/**
*
* @param obj
* 待执行方法的对象
* @param ClassName
* 待执行方法对象的类
* @param MethodName
* 待执行的方法名
* @param ParameterValue
* 待执行方法的参数
*/
public void execute(Object obj, String ClassName, String MethodName,
String ParameterValue) {
Class cls = null;
try {
cls = Class.forName(ClassName);
} catch (ClassNotFoundException e) {
// 通过ClassName反射获取该类失败
e.printStackTrace();
}
Method method = null;
try {
method = cls.getMethod(MethodName, String.class);
} catch (SecurityException e) {
// 通过MethodName反射获取该方法失败,SecurityManager校验失败
e.printStackTrace();
} catch (NoSuchMethodException e) {
// 通过MethodName反射获取该方法失败,该方法不存在
e.printStackTrace();
}
try {
method.invoke(obj, ParameterValue);
} catch (IllegalArgumentException e) {
// 反射执行该方法失败,参数不正确
e.printStackTrace();
} catch (IllegalAccessException e) {
// 反射执行该方法失败,无法执行
e.printStackTrace();
} catch (InvocationTargetException e) {
// 反射执行该方法失败,该方法本身抛出异常
e.printStackTrace();
}
}
简单总结