java反射 reflecthelper_Java反射机制详解

什么是反射机制

反射机制可以帮助我们在动态运行的时候,可以获得其所有的方法(包括 public protected private 默认状态的),所有的变量 (包括 public protected private 默认状态的)。

获取构造方法(Constructor,Declared)

getConstructor(Class>… parameterTypes):获取指定的构造方法,只能获取到public权限的构造方法

getConstructors(Class>… parameterTypes):获取所有的构造方法,只能获取到public权限的构造方法

getDeclaredConstructor:获取指定的构造方法,包括public、private、protected、默认权限

getDeclaredConstructors:获取所有的构造方法,包括public、private、protected、默认权限

方法参数:Class>… parameterTypes代表的是方法参数的类型,至于为什么是 … 数组类型的,因为我们参数可能是一个也可能是多个的。

ps.其它方法命名与之类似,不再阐述

logConstructor("com.breeze.diy.recyclermuster.adapter.LineAdapter");

//获取所有构造方法

public void logConstructor(String className) {

try {

Class> aClass = Class.forName(className);

Log.d("Constructor", "aClass: " + aClass);

//获取所有的public权限构造方法

Constructor>[] constructors = aClass.getConstructors();

Log.d("Constructor", "getConstructors: " + Arrays.toString(constructors));

//获取所有的构造方法,包括public,private,protected,默认权限的

Constructor>[] declaredConstructors = aClass.getDeclaredConstructors();

Log.d("Constructor", "getDeclaredConstructors: " + Arrays.toString(declaredConstructors));

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

getConstructor("com.breeze.diy.recyclermuster.adapter.LineAdapter", LineAdapter.OnItemClickListener.class);

//获取指定的构造方法

public void getConstructor(String className, Class>... cl) {

try {

Class> aClass = Class.forName(className);

Log.d("Constructor", "aClass: " + aClass);

//获取指定的public权限构造函数

Constructor> constructor = aClass.getConstructor(cl);

Log.d("Constructor", "getConstructor: " + constructor);

//获取指定的构造函数,包括public,private,protected,默认权限的

Constructor> declaredConstructor = aClass.getDeclaredConstructor(cl);

declaredConstructor.setAccessible(true);

Log.d("Constructor", "getDeclaredConstructor: " + declaredConstructor);

} catch (ClassNotFoundException | NoSuchMethodException e) {

e.printStackTrace();

}

}

注意事项

如果该方法,或者该变量不是 public 访问权限的,我们应该调用相应的 setAccessible(true) 方法,才能访问得到

//if Constructor is not public,you should call this

declaredConstructor.setAccessible(true);

获取成员变量(Field,Declared)

logConstructor("com.breeze.diy.recyclermuster.adapter.LineAdapter");

//获取所有成员变量

public void logConstructor(String className) {

try {

Class> aClass = Class.forName(className);

Log.d("Constructor", "aClass: " + aClass);

Field[] fields = aClass.getFields();

Log.d("Constructor", "getConstructors: " + Arrays.toString(fields));

Field[] declaredFields = aClass.getDeclaredFields();

Log.d("Constructor", "getDeclaredConstructors: " + Arrays.toString(declaredFields));

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

getConstructor("com.breeze.diy.recyclermuster.adapter.LineAdapter", "mStrings");

//获取指定成员变量

public void getConstructor(String className, String s) {

try {

Class> aClass = Class.forName(className);

Log.d("Constructor", "aClass: " + aClass);

Field field = aClass.getField(s);

Log.d("Constructor", "getConstructor: " + field);

Field declaredField = aClass.getDeclaredField(s);

Log.d("Constructor", "getDeclaredConstructor: " + declaredField);

} catch (Exception e) {

e.printStackTrace();

}

}

获取方法(Method,Declared)

getDeclaredMethod(String name, Class>... parameterTypes)

getMethod(String name, Class>… parameterTypes)

方法参数:name 代表的是方法的名称、Class>… parameterTypes 代表的是方法参数的类型,至于为什么是 … 数组类型的,因为我们参数可能是一个也可能是多个的。

//Person 为className的类

Person person=new Person();

Method method = ReflectHelper.getMethod(CLASS_NAME,

"setCountry", String.class);

try {

// 执行方法,结果保存在 person 中

Object o = method.invoke(person, CHINA);

// 拿到我们传递进取的参数 country 的值 China

String country=person.country;

PrintUtils.print(country);

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值