Java 高级基础——反射

Java 高级基础——反射

反射的意义:Java 强类型语言,但是我们在运行时有了解、修改信息的需求,包括类信息、成员信息以及数组信息。

基本类型与引用类型

基本类型,(固定的 8 种)
整数:byte, short, int, long
小数:float, double
字符:char
布尔值:boolean
引用类型
所有的引用类型都继承自 java.lang.Object
类,枚举,数组,接口都是引用类型
java.io.Serializable 接口,基本类型的包装类(比如 java.lang.Double)也是引用类型

获得class对象的三种方式

  1. 调用Object类的getClass()方法来得到Class对象,该方法用于返回调用该方法的对象的所属类关联的Class对象。
MyObject x;
Class c1 = x.getClass();
  1. 使用Class类的中静态forName()方法获得与字符串对应的Class对象。
Class c2=Class.forName("MyObject")
  1. 如果T是一个Java类型,那么T.class就代表了匹配的类对象。例如
 Class cl1 = Manager.class;
 Class cl2 = int.class;
 Class cl3 = Double[].class;

Class类的常用方法

一个 Class 可以被以下修饰符的一种或者多种修饰:
访问权限控制符:public, protected, private
抽象的、需要实现的:abstract
限制只能有一个实例的:static
不允许修改的:final
线程同步锁:synchronized
原生函数:native
采用严格的浮点精度:strictfp
接口
注解

  1. getName()
    一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
  2. newInstance()
    创建对象实例,newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
  3. getClassLoader()
    返回该类的类加载器。
  4. getSuperclass()
    返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
  5. isArray()
    判定此 Class 对象是否表示一个数组类。
  6. getMethod()
    根据方法名称和参数类型获取方法,String name, Class... parameterTypes,方法参数可能有一个也可能有多个,由于java具有重载的特性,一个类中可能同时存在多个同名方法,所以参数类型必须指定。该方法可以获得类的公有方法,包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。
  7. getDeclaredMethod()
    获取的是类自身声明的所有方法,包含public、protected和private方法。

method用法

方法可以被以下修饰符修饰:
访问权限控制符:public, protected, private
限制只能有一个实例的:static
不允许修改的:final
抽象,要求子类重写:abstract
预防重入的同步锁:synchronized
用其他语言实现的方法:native
严格的浮点型强度:strictfp
注解

  1. method.invoke()
    用于执行方法,参数Object obj, Object... args,第一个是调用的对象,第二个是方法需要传入的参数,参数按顺序传入。
  2. getAnnotatedReturnType()
    方法返回目标方法的返回类型的Type对象。如果目标方法被声明为返回void,则该方法返回void.class。
  3. getGenericParameterTypes()
    该方法返回目标方法所有参数类型的Type对象数组,这些Type对象将按照参数的声明顺序存储于在数组中。如果目标方法没有任何参数,则该方法返回一个空数组。
  4. getParameters()
    获取方法参数名称

Field用法

  1. getType()
    返回变量的类型
  2. getDeclaredField()
    获取变量的值,此方法可以获得私有变量。注意:射获取或者修改一个变量的值时,编译器不会进行自动装/拆箱。
  3. getField()
    获得公有public变量

Java 可变参数方法

public void testVarargs(String... strings){
    //...
}

创建时必须放在方法尾部,即一个方法只能有一个可变数组参数
调用时可以传入一个数组:

testVarargs(new String[]{"shixin","zhang"});

也可以分别传入多个参数:

testVarargs("shixin","zhang");

你可能感兴趣的:(Java 高级基础——反射)