反射类就可以间接调用目标Class的各项功能
来源:互联网 发布:中国年鉴网络出版 编辑:程序博客网 时间:2024/05/22 07:50
packagecom.baobaotao. reflect;
importjava.lang.reflect.Constructor;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
public classReflectTest {
public static Car initByDefaultConst() throws Throwable
{
//①通过类装载器获取Car类对象
ClassLoader loader =Thread.currentThread().getContextClassLoader();
Class clazz =loader.loadClass("com.baobaotao.reflect.Car");
//②获取类的默认构造器对象并通过它实例化Car
Constructor cons =clazz.getDeclaredConstructor((Class[])null);
Car car = (Car)cons.newInstance();
//③通过反射方法设置属性
Method setBrand =clazz.getMethod("setBrand",String.class);
setBrand.invoke(car,"红旗CA72");
Method setColor =clazz.getMethod("setColor",String.class);
setColor.invoke(car,"黑色");
MethodsetMaxSpeed = clazz.getMethod("setMaxSpeed",int.class);
setMaxSpeed.invoke(car,200);
return car;
}
public static void main(String[] args)throws Throwable {
Car car = initByDefaultConst();
car.introduce();
}
}
这说明我们完全可以通过编程方式调用Class的各项功能,这和直接通过构造函数和方法调用类功能的效果是一致的,只不过前者是间接调用,后者是直接调用罢了。
在ReflectTest中,使用了几个重要的反射类,分别是
ClassLoader、
Class、
Constructor
和
Method,
通过这些反射类就可以间接调用目标Class的各项功能了。
在①处,我们获取当前线程的ClassLoader,然后通过指定的全限定类“com.baobaotao.beans.Car”装载Car类对应的反射实例。
在②处,我们通过Car的反射类对象获取Car的构造函数对象cons,通过构造函数对象的newInstrance()方法实例化Car对象,其效果等同于new Car()。
在③处,我们又通过Car的反射类对象的getMethod(String methodName,Class paramClass)获取属性的Setter方法对象,第一个参数是目标Class的方法名;第二个参数是方法入参的对象类型。获取方法反射对象后,
即可通过invoke(Object obj,Object param)方法调用目标类的方法,该方法的第一个参数是操作的目标类对象实例;第二个参数是目标方法的入参。
- 反射类就可以间接调用目标Class的各项功能
- 静态方法不能直接调用实例方法和变量,但可以间接调用(即在静态方法中创建类的实例,然后调用)
- 间接调用指针所指的类成员的方法
- Delphi 创建建具有“反射调用”功能的类
- 使用Java的反射功能调用类中的方法
- 反射的基石:class类
- 反射的基石->Class类
- 反射的基石Class类
- Class类--反射的基石
- Class类,反射的概念
- JAVA的反射 class类
- 反射--Class类的使用
- C语言可以直接或间接调用数据库吗?
- 简单配置.htaccess就可以实现的10个功能
- 用反射来调用Android里的隐藏Class
- 用反射来调用Android里的隐藏Class
- java反射机制与调用&&Class的介绍
- .Net 邮件发送的类,在程序中直接调用就可以了
- TortoiseGit文件夹和文件图标不显示(Git)
- ThinkPHP去除url中的index.php
- GIT 提交异常 fatal: LF would be replaced by CRLF
- 终极指南 - 怎样为iOS8应用制作预览视频
- iOS图片处理之滤镜效果
- 反射类就可以间接调用目标Class的各项功能
- ftp主动与被动
- 第一篇博文
- 浅述extern C的用法 和 无导入表PE的实现
- ipv6禁用
- PhotoShop中创建棋盘格的脚本
- @Resource annotation is not supported on static fields
- 用PHP的ob_start()控制您的浏览器cache
- 用DexClassLoader实现加壳