Java反射基础内容

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中有

  1. TYPE:类、接口
  2. FIELD:成员变量
  3. METHOD:成员方法
  4. PARAMETER:方法参数
  5. CONSTRUCTOR:构造器
  6. LOCAL_VARIABLE:局部变量

@Retention(RetentionPolicy.RUNTIME):注解存在的生命周期

  1. SOURCE:只存在与源码阶段
  2. CLASS(默认):保留到字节码文件阶段,运行时不存在
  3. RUNTIME(常用):一直保留在运行阶段

4、如何获取注解

获取注解要通过反射

因为Class、Method、Constructor、Field都实现了AnnotatedElement接口,所以他们都有解析注解的能力

方法:要解析谁上面的注解,就得先拿到谁

如:获取类上的注解就得先获取到Class对象;想获取方法上的注解就得先获取到Method对象

Annotation[] getDeclaredAnnotations()

T getDeclaredAnnotation(Class annotationClass)

boolean isAnnotationPresent(Class annotationClass)

你可能感兴趣的:(java基础,java)