反射基本使用

158 阅读2分钟

1、简介

  • 定义:
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为Java的反射机制。
  • 反射机制类:
 //类 
java.lang.Class;  
//构造方法 
java.lang.reflect.Constructor;
//类的成员变量    
java.lang.reflect.Field; 
//类的方法
java.lang.reflect.Method;
//访问权限
java.lang.reflect.Modifier;

2、反射类

//通过Class类的静态方法——forName()来实现
Class<?> clazz = Class.forName("com.liujian.reflectdemo.Person");

3、反射创建对象

3.1 不带带参数构造

//Class对象调用newInstance()方法生成
Object obj = clazz.newInstance();

3.2 带参数构造

//对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成
//获取指定声明构造函数
Constructor<?> constructor = clazz.getDeclaredConstructor(new Class[]{String.class});
Object obj = constructor.newInstance(new Object[]{"liujian"});

4、反射方法

4.1获取所有方法

getMethods(): 获取包括自身和继承过来的所有的public方法   
Method[] methods = clazz.getMethods();

getDeclaredMethods():获取自身类中所有的方法(不包括继承的,和访问权限无关)     
Method[] methods = clazz.getDeclaredMethods();

4.2获取指定方法

  • 方法范围
getMethod():表示调用指定的一个公共的方法(包括继承的)     
getDeclaredMethod:表示调用指定的一个本类中的方法(不包括继承的)
  • 有无参数
//无参
getMethod(String methodName)
getDeclaredMethod(String name)
//有参
getMethod(String methodName,Class<>… parameterTypes)
getDeclaredMethod(String name,Class<>… parameterTypes)
参数:
    methodName: 表示被调用方法的名字
    parameterTypes:表示被调用方法的参数的Class类型如String.class
  • 传参形式
//直接写参数形式
Method method = clazz.getMethod("run",String.class);
//数组参数形式
Method method = clazz.getMethod("run",new class[]{String.class});

5、反射属性

//获取class对象的所有属性
Field[] allFields = clazz.getDeclaredFields();
//获取class对象的public属性
Field[] publicFields = clazz.getFields();
//获取class指定属性
Field ageField = clazz.getDeclaredField("age");
//获取class指定的public属性
Field desField = clazz.getField("des");

6、调用反射方法

public Object invoke(Object obj,Object… args):表示调用当前Method所表示的方法
  参数:
        obj: 表示被调用方法底层所属对象(调用静态方法的时可以为nul)
             Method m = clz.getMethod("liujun",String.class);
        args:表示调用方法是传递的实际参数
  返回:
        底层方法的返回结果
        
//如果调用私有方法,应该设置该方法为可访问的
method.setAccessible(true);
method.invoke(clazz,"liujian");