1. 获取字节码对象的三个方法是什么?
Class.forName(全类名)
对象.getClass();
类名.class
2. 获取无参构造器的方法有哪些,他们有什么区别?
字节码对象.getDeclaredConstructor();
字节码对象.getConstructor();
getConstructor只能获取公共构造器,getDeclaredConstructor可以获取所有构造器
3. 获取带参构造器的方法有哪些,他们有什么区别?
字节码对象.getDeclaredConstructor(Class …args);
字节码对象.getConstructor(Class …args);
getConstructor只能获取公共构造器,getDeclaredConstructor可以获取所有构造器
4. 通过类构造器实例化的方法是什么?
构造器对象.newInstance(Object …args);
使用的是构造器对象,而不是字节码对象
5. 通过类的私有构造器实例化时,会出现什么问题?怎么解决?
会出现访问修饰符为private,访问权限不允许
解决方法:设置访问权限为true:构造器对象.setAccessible(Boolean flag)
6. 如何获取类的成员变量?
字节码对象.getFileds() // 获取不到私有成员变量
字节码对象.getDeclaredFileds() // 可以获取到成员变量
字节码对象.getField(String name)
字节码对象.getDeclaredField(String name)
7. 如何给变量赋值?
注意:上面的只是获取到成员变量,这里是给变量赋值,不一样
变量对象.set(Object obj, Object val) // 第一个参数是打算给哪个对象赋值,第二个参数是要赋的值
一个字节码类对应多个对象,所以我们需要针对某个对象进行赋值,而不是对所有对象进行赋值,这里需要写上要赋值的对象
8. 对于私有成员变量赋值时访问权限异常如何设置?
注意:是在赋值前设置权限,不是在之后
变量对象.setAccessible(boolean flag)
9. 如何获取变量的值?
变量对象.get(Object obj)
10. 如何获取成员方法?
getDeclaredMethods
getMethods
getDeclaredMethod(String name, Class<?> ...parameterType) getMethod(String name, Class<?> …parameterType)
11. 如何执行方法,以及其权限设置?
方法对象.invoke(Object obj, Object …args)
方法对象.setAccessible(boolean flag)
12. 如何获取注解?
方法:要解析谁上面的注解,就得先拿到谁
如:获取类上的注解就得先获取到Class对象;想获取方法上的注解就得先获取到Method对象
public Annotation[] getDeclaredAnnotations() // 由于注解是Annotation的子类,所以这个返回值就是注解数组
public T getDeclaredAnnotation(Class annotationClass)
13. 如何判断当前对象是否存在某注解?
public boolean isAnnotationPresent(Class annotationClass)
===
1. 注解是什么?
注解是代码中的特殊标记,让程序根据注解来执行决定如何执行
注解定义:
public @interface TestAnno {
String value(); // 特殊属性
String str();
boolean bbb() defalut true;
}
编译后:
public interface TestAnno extends Annotation {
public abstract String value();
public abstract String str();
public abstract boolean bbb() defalut true;
}
总结:
- 注解的定义通过@interface表示,所有的注解会自动继承java.lang.Annotation接口,且不能再继承别的类或是接口。
- 注解的成员参数只能用public或默认 (default) 访问权修饰来进行修饰。
- 成员参数只能使用八种基本类型(byte、short、char、int、long、float、double、boolean)和String、Enum、Class、annotations等数据类型,及其数组。
- 获取类方法和字段的注解信息,只能通过Java的反射技术来获取 Annotation 对象。
- 注解可以没有定义成员,只做标识。
2、注解中的成员变量如何定义?
- 注解中的成员变量的声明与接口中方法的声明是相同的
- 注解的变量可以定义默认值
- 注解中有特殊属性:value()。如果只存在value()属性或者注解中其他属性都有默认值,那么使用注解时,如果不写属性名,默认使用的就是value。除了上面的两种情况,其他情况下都需要在使用注解时,声明使用的属性名以及给他赋的值。
如:
public @interface TestAnno {
String value(); // 特殊属性
String str();
boolean bbb() defalut true;
}
3、什么是元注解,元注解有哪些?
元注解是修饰注解的注解,用来标识当前注解的使用范围和注解存在的生命周期
元注解有两个:@Target和@Retention
@Target(ElementType.TYPE):修饰注解使用的位置,可以同时使用多个范围,是个数组
ElementType中有
- TYPE:类、接口
- FIELD:成员变量
- METHOD:成员方法
- PARAMETER:方法参数
- CONSTRUCTOR:构造器
- LOCAL_VARIABLE:局部变量
@Retention(RetentionPolicy.RUNTIME):注解存在的生命周期
- SOURCE:只存在与源码阶段
- CLASS(默认):保留到字节码文件阶段,运行时不存在
- RUNTIME(常用):一直保留在运行阶段
4、如何获取注解
获取注解要通过反射
因为Class、Method、Constructor、Field都实现了AnnotatedElement接口,所以他们都有解析注解的能力
方法:要解析谁上面的注解,就得先拿到谁
如:获取类上的注解就得先获取到Class对象;想获取方法上的注解就得先获取到Method对象
Annotation[] getDeclaredAnnotations()
T getDeclaredAnnotation(Class annotationClass)
boolean isAnnotationPresent(Class annotationClass)